我想为设计当前资源创建一个类似current_user的方法。 假设我有两个资源,如User和Admin,并且设计与两者相关联。像往常一样,它动态创建它的默认方法,如current_user和current_admin。
它通过在文件lib/devise/controllers/helpers.rb中定义如下来创建它:
def current_#{mapping}
如何在其动态方法中添加这样的新方法。
我想用设计方法实现它,这样当设计初始化时,我的方法也用相同的映射名称初始化。
答案 0 :(得分:2)
将此代码复制到应用程序控制器中。你的问题就会解决。
Devise.mappings.each do |mapping, obj|
define_method "current_#{mapping}_email" do
eval("current_#{mapping}.email if current_#{mapping}")
end
helper_method "current_#{mapping}_email"
在根据您的资源名称使用的视图页面/控制器上 比如你有resource_name作为用户然后它的' current_user_email' 或者如果有管理员那么' current_admin_email'
答案 1 :(得分:-1)
这有效!
我添加了一个自定义方法current_user_email
,如下所示!
在config / initializers中添加文件devise_ext.rb:
在该文件中,以这种方式添加自定义方法:
模块设计 模块控制器 #这些助手是添加到ApplicationController的便捷方法。 模块助手
def self.define_helpers(mapping) #:nodoc:
mapping = mapping.name
class_eval <<-METHODS, __FILE__, __LINE__ + 1
def authenticate_#{mapping}!(opts={})
opts[:scope] = :#{mapping}
warden.authenticate!(opts) if !devise_controller? || opts.delete(:force)
end
def #{mapping}_signed_in?
!!current_#{mapping}
end
def current_#{mapping}
@current_#{mapping} ||= warden.authenticate(scope: :#{mapping})
end
def #{mapping}_session
current_#{mapping} && warden.session(:#{mapping})
end
def current_#{mapping}_email
@current_#{mapping}.email if @current_#{mapping}
end
METHODS
ActiveSupport.on_load(:action_controller) do
helper_method "current_#{mapping}", "#{mapping}_signed_in?", "#{mapping}_session", "current_#{mapping}_email"
end
end
end
end
end
P.S。我不认为这是最好的方法。但它的确有效。我在我的一个应用程序中试过这个!您可以使用此代码,直到找到更好的方法:)