コントローラーで使用attr_accessor
して、applicationController で定義されたメソッドに設定されているアクセス許可を保存していますが、問題があります。私がこれを行う場合:
class ApplicationController < ActionController::Base
attr_accessor :perms
def self.set_permissions *permissions
self.perms = permissions
end
def check_permissions
print self.perms
end
end
perms=
次に、レールは存在しないと主張します
私が行った場合:
class ApplicationController < ActionController::Base
attr_accessor :perms
def self.set_permissions *permissions
@perms = permissions
end
def check_permissions
print @perms
end
end
@perms
incheck_permissions
はnil
任意の子コントローラーにあります。次を使用して使用可能なインスタンスメソッドを確認しましprint self.instance_variables
たが@perms
、表示されませんでした。おそらく@perms
、アクションが呼び出されたときに作成されるコントローラーのオブジェクトインスタンスではなく、クラスインスタンスに対して設定されているためです
どうしたの?レールはattr_accessor
コントローラーが好きではありませんか? クラス内でアクセス許可を設定し、そのクラスの任意のオブジェクトにアクセスできるようにして、次のように設定できるようにするにはどうすればよいですか。
class Api::ApiController < ApplicationController
set_permissions :api
before_action :check_permissions, except: :set_permissions
end
を使用する必要がありますself.set_permissions
。そうしないと、set_permissions を設定しようとすると、存在しないと主張されます (クラス メソッドではなくオブジェクト メソッドであるため)。
編集:明確にするために、コントローラーにパーミッションを設定したい(ただし、コントローラーごとに異なる); 継承されたコントローラー内で個別に定義されていない限り、そのコントローラーのインスタンス (つまり、アクション用に作成されたオブジェクト インスタンス) またはそのコントローラーから継承するコントローラー (たとえば、ノード コントローラーは API コントローラーから継承するため、同じパーミッションを使用する) と同じになります。 (tokens コントローラーは api コントローラーから継承しますが、アクセス許可なしで実際にトークンを取得できるようにする必要があります)。