0

私はJavaのバックグラウンドを持っています。定数値を格納するクラスを持つ方法があるかどうか疑問に思っていました。

私の問題に固有のもので、次のようなことができるかどうか疑問に思っていました:

@user.authentications.create(:uid => "12345", :provider => Provider::FACEBOOK)

ここで、Provider クラスはすべての静的定数を格納しました。また、これはRuby on Railsで行う正しい方法ですか?

追加情報: 上記を試してみました

class Provider
  FACEBOOK = "facebook"
  TWITTER = "twitter"
end

しかし、それはエラーを出しました:

NameError:
       uninitialized constant Provider
4

3 に答える 3

1

オプション 1 (クラス変数):

class Provider
  @@FACEBOOK = "facebook"
  @@TWITTER = "twitter"
end

@user.authentications.create(:uid => "12345", :provider => Provider.FACEBOOK)

場合によっては、クラス変数を使用しないことを強くお勧めします。より良い方法は、meta voodoo を使用することです。

class Provider
  @FACEBOOK = "facebook"
  @TWITTER = "twitter"

  class << self
    attr_reader :FACEBOOK, :TWITTER
  end
end

@user.authentications.create(:uid => "12345", :provider => Provider.FACEBOOK)
于 2012-05-22T22:05:25.283 に答える
0

モデルファイルでそのクラスを宣言すると、アクセス可能になります。libファイルで宣言している場合は、application.rbファイルに1行追加します。

config.autoload_paths += %W(#{config.root}/lib)
于 2012-05-23T18:36:48.710 に答える
0

上記の実装を維持したい場合

Provider::FACEBOOKの前に二重コロンを付けてみてください

::Provider::FACEBOOK

これにより絶対パスが設定されるため、Rubyは現在のコンテキスト/クラス/コントローラー内の定数を検索しようとしません。(私の仮定では、現在、定数はで定義されていると考えていますUserController::Provider::FACEBOOK

より多くのレール風

定数を置く場所については他にもたくさんの投稿がありますので、チェックしてください:

基本的に、実際に必要な場所に定数を配置します。コントローラ/モデル内、またはenvironment.rbどこからでもアクセスしたい場合は。

于 2012-05-22T22:32:39.840 に答える