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

时间:2014-04-25 12:56:07

标签: ruby-on-rails ruby devise rubygems

我想为设计当前资源创建一个类似current_user的方法。 假设我有两个资源,如User和Admin,并且设计与两者相关联。像往常一样,它动态创建它的默认方法,如current_user和current_admin。

它通过在文件lib/devise/controllers/helpers.rb中定义如下来创建它:

def current_#{mapping}

如何在其动态方法中添加这样的新方法。

我想用设计方法实现它,这样当设计初始化时,我的方法也用相同的映射名称初始化。

2 个答案:

答案 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。我不认为这是最好的方法。但它的确有效。我在我的一个应用程序中试过这个!您可以使用此代码,直到找到更好的方法:)