0

application_controller.rbコントローラーで、それを継承するすべてのコントローラーがアクセスできる変数を宣言したいと思います。可能であれば、変数は子クラスでのみアクセス可能であり、ビューを含めて他の場所ではアクセスできないようにします(特にビューに渡されない限り)。

私はRubyとRailsを初めて使用しますが、変数に「保護された」スコープが存在するかどうかはわかりませんが、関数には存在することがわかりました。私は簡単な答えを見つけることができず、変数を宣言するさまざまな方法とそれらにアクセスできる場所をアプリで少し実験してきました。それは私がこれをどのように達成できるかについての情報を私に提供しませんでした。

どんな助けでも大歓迎です。

コード:

class ApplicationController < ActionController::Base
    protect_from_forgery
    @admin_name = "AdminUserName"
    @admin_password = "AdminPassword"
end

class ProjectsController < ApplicationController
    http_basic_authenticate_with :name => @admin_name, :password => @admin_password, :except => [:index, :show]

    # controller functions here
end

これは私にはうまくいかないようです。

4

1 に答える 1

1

ご存知のように、rubyの変数には保護されたスコープのようなものは存在しません。Railsのインスタンス変数を使用して、ビューにアクセスできるコントローラーに変数を設定できます。これは、ビューのコントローラーで設定されたインスタンス変数を使用できる古いRails機能です。

インスタンス変数はインスタンスからインスタンスに継承されます

class A
  def make_ivar
    @foo = 'bar'
  end
end

class B < A
  def get_ivar
    @foo
  end
end

b = B.new
b.make_ivar
b.get_ivar #=> @foo

ただし、インスタンス変数をビューレールに渡すことはカプセル化を破ることになり、すべてのパーシャルでそれを使用することは良い習慣ではない可能性があることに注意してください。何よりも、ビューに到達したらすぐにインスタンス変数をローカル変数に置き換えます

アップデート

あなたの場合、定数を使用してください。定数は、それらが定義されて継承されるクラスのスコープの下にありますが、スコープで呼び出されない限り、ビューで使用することはできません。

class ApplicationController < ActionController::Base
  protect_from_forgery
  ADMIN_NAME = "AdminUserName"
  ADMIN_PW = "AdminPassword"
end

class ProjectsController < ApplicationController
  http_basic_authenticate_with :name => ADMIN_NAME, :password => ADMIN_PW, :except => [:index, :show]

  # controller functions here
end

ビューでそれらを呼び出したくないと思います。あなたが本当にそれをしたいのなら、あなたはこのようにそれをすることができます:

ApplicationController::ADMIN_NAME
于 2012-07-13T16:44:28.793 に答える