基本的には、コントローラのメソッドの重大性を定義するために単純なRails拡張を実装して、それらの使用を適切に制限できるようにしたいと思います。例えば、私は抽象スーパークラスになるようにデフォルト安らかなアクションを定義したい:クラスのデフォルトを設定し、サブクラスのオーバーライドを許可するRuby on Railsパターン
view_methods :index, :show
edit_methods :new, :create, :edit, :update
destroy_methods :destroy
を私はその後、ダウン非抽象コントローラコールでたい:
edit_methods :sort
は、sortメソッドに追加しますその特定のコントローラ上では編集レベルの方法である。
これで、before_filterを使用して現在実行中のアクションのレベルを確認し、自分のロジックで現在のユーザーが実行できないと判断した場合は中止できます。
問題は、この種の構造を設定する方法がわかりません。私はこれまでのところ、このような何かを試してみた:
class ApplicationController
@@view_methods = Array.new
@@edit_methods = Array.new
@@destroy_methods = Array.new
def self.view_methods(*view_methods)
class_variable_set(:@@view_methods, class_variable_get(:@@view_methods) << view_methods.to_a)
end
def self.edit_methods(*edit_methods)
class_variable_set(:@@edit_methods, self.class_variable_get(:@@edit_methods) << edit_methods.to_a)
end
def self.destroy_methods(*destroy_methods)
@@destroy_methods << destroy_methods.to_a
end
def self.testing
return @@edit_methods
end
view_methods :index, :show
edit_methods :new, :create, :edit, :update
destroy_methods :destroy
end
上記の3つの方法がちょうど私が試したものをお見せするために、意図的に異なっています。 3つ目は動作しますが、どのコントローラをテストしても同じ結果が返されます。おそらくクラス変数がアプリケーションコントローラに格納されているので、グローバルに変更されるからです。
ご協力いただければ幸いです。
うわー!それはまさに私が探していたものです。その情報をありがとうございます。これが他の人にも役立つことを願っています。それはあなたがそれに答えてうれしいので、それを検索するのは難しいです:) –