Rails在所有控制器操作中变量

jim*_*jim 26 ruby ruby-on-rails

这应该是一个非常简单的轨道问题.我有一个如下变量.

@administration = Administration.first
Run Code Online (Sandbox Code Playgroud)

我希望通过我所有控制器上的每个控制器操作都可以访问这个变量,例如,如果我有一个Product控制器,并且在其中我有通常的CRUD操作,我希望将上面定义的@administration变量放入所有CRUD行动.(在销毁或创建或更新时不需要它).我的项目中有很多控制器,我想知道是否有一种比通过我想要的所有操作手动添加它更简单的方法.

我尝试了一个全局变量

 $administration = Administration.first
Run Code Online (Sandbox Code Playgroud)

但是当我更新Administration.first表的实际内容时,我遇到了一个没有更新的问题.另外,我想避免全局变量.

任何帮助将非常感激.谢谢!:)

小智 70

您可以在ApplicationController中添加before_filter,在调用任何操作之前设置管理变量,并且可以将其限制为仅需要的操作.

class ApplicationController < ActionController::Base
...
before_filter :set_admin
def set_admin
  @administration = Administration.first
end
..
Run Code Online (Sandbox Code Playgroud)

http://api.rubyonrails.org/v2.3.8/classes/ActionController/Filters/ClassMethods.html


Uģi*_*ols 16

只是扩展Christos帖子......

如果你不希望@administration可以被销毁,创建和更新控制器动作,那么添加:except =>:action to before_filter,如下所示:

before_filter :set_admin, :except => [:create, :update, :destroy]

在Rails 4和5之前,before_filter它已被弃用.您可以使用此代替:

before_action:set_admin,但:[:create,:update,:destroy]除外