【问题标题】:The same current_user on multiple models in devise设计中多个模型上的相同 current_user
【发布时间】:2012-05-11 09:44:40
【问题描述】:

问题

我有一个 User 模型,以及从 User 模型继承的 Volunteer 模型:

class User < ActiveRecord::Base
end

class Volunteer < User
end

它们都保存在数据库的同一张表上,但有不同的控制器/路由。

路线是:

devise_for :users ....
devise_for :volunteers ....

这很好用,但我使用的授权系统依赖于current_user 助手。这对志愿者来说是失败的,因为 devise 为志愿者模型创建了 current_volunteer

我尝试设置devise_for :volunteers, :singular =&gt; "user",这会创建一个current_user,它指代用户和志愿者,但现在的问题是志愿者的路线搞砸了。

问题

所以我的问题是,有没有办法让current_user 助手,指代用户以外的另一个模型?

【问题讨论】:

  • 你用过cancan授权gem吗?
  • @Suborx,声明式授权,但已大大扩展

标签: ruby-on-rails devise


【解决方案1】:

我认为这样可以让用户在同一个会话中以用户和志愿者的身份登录。

一旦你有办法处理它,你能不只是有

# in application_controller.rb
alias_method :devise_current_user, :current_user
def current_user
  devise_current_user || current_volunteer
end

在您的 application_controller.rb 中

【讨论】:

    【解决方案2】:

    我遇到了类似的问题并像这样解决了它。但是这个解决方案是针对 cancan gem 的吗?

    application_controller.rb

    def actual_user
      @actual_user ||= current_user.present? ? current_user : current_volunteer
    end
    
    def current_ability
      @current_ability ||= Ability.new(actual_user)
    end
    

    【讨论】:

      【解决方案3】:

      我接受了 viktor tron 的回答,因为这似乎是最干净的方法。

      但是,我以不同的方式解决了我的问题。

      我最终将其他类的登录过程硬编码为:user。这让我可以访问current_user 方法,即使是志愿者课程。

      class Volunteers::SessionsController < Users::SessionsController
      
        def create
          resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
          if resource
            flash[:notice] = "You are logged in"
            sign_in(:user, resource)
            super
          else
            super
          end
        end
      
      end
      

      【讨论】:

        【解决方案4】:

        可能有点晚了,但您可以在您的 routes.rb 中尝试以下操作

        devise_for :users , :skip => :registrations
        as :user do
            match "volunteers/edit(.:format)", :to => "devise/registrations#edit"
        end
        devise_for :volunteers , :skip => :sessions
        

        以上代码假设所有用户及其子类(假设您正在实施 STI 以实现用户模型层次结构)都可以登录和注销,但只有志愿者可以注册。由于志愿者是用户,因此用户应该能够编辑他的注册。您可以在 as :user 块中添加更多路由。

        【讨论】:

          猜你喜欢
          • 2015-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多