我有一组适用于某些控制器的 before_helpers 和 helper_methods,包括所有设计控制器。
在过滤器之前声明它们的首选方法是什么?
我尝试了这篇文章但没有成功(出现错误sessions_controller.rb to define Devise::SessionsController (LoadError)
)。如果我重新做所有的控制器,我需要从看起来重复的 gem 中再次复制相同的代码。
知道我该怎么做吗?
我有一组适用于某些控制器的 before_helpers 和 helper_methods,包括所有设计控制器。
在过滤器之前声明它们的首选方法是什么?
我尝试了这篇文章但没有成功(出现错误sessions_controller.rb to define Devise::SessionsController (LoadError)
)。如果我重新做所有的控制器,我需要从看起来重复的 gem 中再次复制相同的代码。
知道我该怎么做吗?
将您before_filter
的放入您的application_controller.rb
并检查是否params[:controller]
是设计控制器的名称:
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_filter :check_if_devise
private
def check_if_devise
if ['confirmations', 'omniauth_callbacks', 'passwords', 'registrations', 'sessions', 'unlocks'].include? params[:controller]
# logic for before_filter
end
end
end
更新:
或者,如果您想让您的存在与逻辑before_filter
分开check_if_devise
,您可以从中删除现有函数before_filter
并仅在条件逻辑check_if_devise
通过时调用它:
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_filter :check_if_devise
private
def check_if_devise
if ['confirmations', 'omniauth_callbacks', 'passwords', 'registrations', 'sessions', 'unlocks'].include? params[:controller]
function_to_run
end
end
def function_to_run
# code goes here
end
end
将其放置在application_controller.rb
其中将确保before_filter
为设计控制器运行。对于其他单独的一次性控制器,您可以调用function_to_run
为before_filter
:
# app/controller/random_controller.rb
class RandomController < ApplicationController
before_filter :function_to_run
end