我在Rails中学习了很多关于DRY概念的问题,所以这里是我的问题:
我的应用程序中有一个固定的侧边栏,它总是需要加载各种对象,例如Locations
。
在与我的index
页面相关的控制器中,实际上在controllers/pages_controller.rb
我正在加载@locations
:
@company = current_user.company
@locations = if @company
current_user.company.locations.order(:name)
else
[]
end
这适用于我的导航菜单(侧边栏),但是,一旦我选择了一个位置并加载了从不同控制器委托的视图(在这种情况下为locations/show.html.erb
),我的@locations
变量就不再存在了找到。
当然,我可以将其添加到show
文件中的locations_controller.rb
方法中,但考虑到我必须将上述代码放在每个单独的内容中,这并不是很干控制器方法,它依赖于侧边栏导航菜单(所有这些!),因为它已经修复。
干什么方式做一次而不必在每个控制器中做到这一点?
答案 0 :(得分:1)
您可以在application_controller
def set_locations
....
end
然后在pages_controller
和locations_controller
添加before_filter
before_filter :set_locations
它将在页面和位置控制器的所有所有方法之前设置调用集位置。
如果您只想为少数控制器操作设置位置,请致电:
before_filter :set_locations,:only=>[:show,:index, :your_action_name]
<强>更新强>
在Rails 5中,{@ 1}}已弃用,您可以使用before_filter
答案 1 :(得分:0)
您可以在每个操作之前运行的方法中将它添加到ApplicationController,每个控制器都从此ApplicationController继承,以便它可用。