0

それらのコントローラーのインデックスアクションへのリンクを持つ変数 @top_tier_link を設定したいコントローラーがたくさんあります。今、私は次のようにしています:

class School::CoursesController < ApplicationController  
  before_filter :set_top_tier_link

  private
    def set_top_tier_link
      @top_tier_link = school_courses_path
    end
end

class School::UsersController < ApplicationController  
  before_filter :set_top_tier_link

  private
    def set_top_tier_link
      @top_tier_link = school_users_path
    end
end

任意のコントローラーに対して自動的に設定できるフィルターの前に定義したいと思います。どうすればそれを達成できますか?

編集:

これは単なるサンプルです。この種のヘルパーを必要とするコントローラーの数ははるかに多くなります。この変数はレイアウト レベルで使用されるため、ほとんどのコントローラで必要になります。

4

1 に答える 1

1

ApplicationController で定義します。params[:controller]そこで、変数に基づいて微分することができます。このようなもの:

before_filter :set_top_tier_link

def set_top_tier_link
  case params[:controller]
    when 'Courses'; @top_tier_link = school_courses_path
    when 'Users'; @top_tier_link = school_users_path
  end
end

または、ほぼ同じことを行うヘルパーを指定することをお勧めします。このような:

def top_tier_link
  @top_tier_link ||= case params[:controller]
    when 'Courses'; school_courses_path
    when 'Users'; school_users_path
  end
end

helper_method :top_tier_link

更新: ハードコーディングしたくない場合は、パス名を自動的に生成できます。少し危険ですが、うまくいくはずです:

def top_tier_link
  @top_tier_link ||= send(params[:controller].gsub("/","_")+"_path")
end
于 2012-08-19T10:21:29.643 に答える