繁体   English   中英

为设计的当前资源创建一个类似current_user的方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM