2

私は Rails を始めたばかりで、私が読んでいるガイドでは当たり前のように思われるいくつかの構文要素を理解するのに苦労しています。

今日の午後、私は小さなサンプル プロジェクトに取り組んでいて、いくつかのコードをリファクタリングしようとしていました。基本的に、現在表示されているページに依存する管理者専用コントロールへのリンクをナビゲーション バーに含めたいと考えています。これは私の元のコードでした:

class RoomsController < ApplicationController
  before_filter :admin_controlls

  def new
  end

  def create
  end

  def edit
  end

  def update
  end

  def index
  end

  def destroy
  end

  private
    def admin_controlls
      @adminControlls = "rooms"
    end
end

私の考えでは、このコードは、管理コントロールを作成するすべてのコントローラーで本質的に同じになると考えていました。唯一の違いは、ビューに渡したいフラグ変数 @adminControlls の値です。

だから、私はこれを試みました:

class ApplicationController < ActionController::Base
  protect_from_forgery
  include SessionsHelper

  def admin_controlls(page)
      @adminControlls = page
  end
end

そして、Rooms コントローラーを次のように変更しました。

class RoomsController < ApplicationController
  before_filter admin_controlls "rooms"

  def new
  end

  def create
  end

  def edit
  end

  def update
  end

  def index
  end

  def destroy
  end

end  

私の混乱は before_filter から始まり、そこでメソッドを呼び出すにはなぜシンボルが必要なのかと思います。メソッドがシンボルとして呼び出されたときに文字列をメソッドに渡す方法がわかりません。メソッドを呼び出す前にフィルターを変更するすべての努力 (上記のように) は失敗しました。全体として、構文の微妙な点を把握しているようには感じていません。誰かが役に立つリソースを持っているなら、私はそれを感謝します.

4

2 に答える 2

1

これを試していただけますか: before_filter { |c| c.admin_controlls "rooms" }? 同様の質問がここにあります: How can I send a parameter to a before filter?

于 2012-09-19T01:27:27.763 に答える
0

シンボルが必要な理由は、Controller クラスが最初にロードされたときに「before_filter」への呼び出しが実行されるためです...しかし、実際の before_filterメソッド(admin_controlls) をすべてのアクションで呼び出す必要があります (1 回だけではありません)。 .

そのため、読み込み時の before_filter 呼び出しは、コントローラー アクションが実行されるたびに、後で呼び出すメソッドの名前を格納します。

于 2012-09-19T09:57:50.247 に答える