Rails全局变量在哪里?

时间:2016-07-01 20:19:54

标签: ruby-on-rails ruby

我在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方法中,但考虑到我必须将上述代码放在每个单独的内容中,这并不是很干控制器方法,它依赖于侧边栏导航菜单(所有这些!),因为它已经修复。

干什么方式做一次而不必在每个控制器中做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以在application_controller

中创建方法
def set_locations
....
end

然后在pages_controllerlocations_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继承,以便它可用。