1

问题

我有一个用户模型,以及从用户模型继承的志愿者模型:

class User < ActiveRecord::Base
end

class Volunteer < User
end

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

路线是:

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

这工作得很好而且很花哨,但是我使用的授权系统依赖于一个current_user助手。这对志愿者来说是失败的,因为设计current_volunteer是为志愿者模型创建的。

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

问题

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

4

4 回答 4

4

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

一旦你有办法处理它,你不仅可以

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

在你的 application_controller.rb

于 2012-05-11T10:15:52.137 回答
0

我遇到了类似的问题并像这样解决了它。但是这个解决方案是专门针对康康宝石的。

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
于 2012-05-11T11:49:55.647 回答
0

我接受了 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
于 2012-05-29T10:11:25.540 回答
0

也许有点晚了,但您可以在您的 routes.rb 中尝试以下内容

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

The above code assumes that all users and its subclasses (assuming what you are implementing STI to achieve Users model hierarchy) can sign_in and sign_out, but only volunteers can register. Since a volunteer is a user, the user should be able to edit his registration as such. You can add more routes inside the as :user block.

于 2012-11-22T07:51:59.493 回答