我有一个方法,类似于这样:
before_filter :authenticate_rights, :only => [:show]
def authenticate_rights
project = Project.find(params[:id])
redirect_to signin_path unless project.hidden
end
我还想在一些其他控制器中使用这种方法,所以我将该方法复制到一个辅助程序中,并将其包含在application_controller中。
问题是,在某些控制器中,项目的id不是:id
符号,而是例如:project_id
(同时也存在另一个模型的:id
)
你如何解决这个问题?是否有选项可以向before_filter操作添加参数(以传递正确的参数)?
,:only => [:show]
符号?我尝试使用before_filter { |c| c.authenticate_rights correct_id_here }, :only => [:show]
时出现错误。 - choisebefore_filter(:only => [:show]) { <block_code_here> }
。这里有更多的例子:http://apidock.com/rails/ActionController/Filters/ClassMethods/before_filter - fguillenbefore_filter
设置为私有方法来保护它,那么可能需要进行重构(例如将其移动到父控制器ApplicationController等),您需要使用c.send(:filter_name, ...)
,因为过滤器不会在控制器上下文中运行。http://guides.rubyonrails.org/action_controller_overview.html#other-ways-to-use-filters - Richard Michaelsend
传递块的事实意味着最好像 @vadym-tyemirov 的答案建议的那样使用 lambda。 - David Pelaez