2

コントローラーで使用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

@permsincheck_permissionsnil任意の子コントローラーにあります。次を使用して使用可能なインスタンスメソッドを確認しまし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 コントローラーから継承しますが、アクセス許可なしで実際にトークンを取得できるようにする必要があります)。

4

1 に答える 1