![](/img/trans.png)
[英]Create a method like Devise's current_user to use everywhere
[英]Create a method like current_user for devise's current resources
我想为devise的当前资源创建一个类似current_user的方法。 假设我有两个资源,如User和Admin,并且设计与两者相关联。 像往常一样,它动态创建默认方法,如current_user和current_admin。
它通过在文件lib / devise / controllers / helpers.rb中定义如下来创建它:
def current_#{mapping}
如何在其动态方法中添加这样的新方法。
我想用设计方法实现它,这样当设计初始化时,我的方法也用相同的映射名称初始化。
将此代码复制到应用程序控制器中。 而你的问题将解决。
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'或者如果有admin,那么'current_admin_email'
这有效!
我添加了一个自定义方法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
PS我不认为这是最好的方法。 但它的确有效。 我在我的一个应用程序中试过这个! 您可以使用此代码,直到我找到更好的方法来做到这一点:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.