我有一个User模型,以及继承自User模型的Volunteer模型:
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
助手,引用除用户以外的其他模型?
答案 0 :(得分:3)
我认为这样您允许用户在同一会话中以用户和Voluteer身份登录。
一旦你有办法解决这个问题,你就不能拥有
# in application_controller.rb
alias_method :devise_current_user, :current_user
def current_user
devise_current_user || current_volunteer
end
你的application_controller.rb 中的
答案 1 :(得分:0)
我遇到了类似的问题并且像这样解决了。但这个解决方案是否适用于康康宝石。
application_controlller.rb
def actual_user
@actual_user ||= current_user.present? ? current_user : current_volunteer
end
def current_ability
@current_ability ||= Ability.new(actual_user)
end
答案 2 :(得分: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
答案 3 :(得分: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
上面的代码假定所有用户及其子类(假设您正在实现STI以实现用户模型层次结构)可以sign_in和sign_out,但只有志愿者可以注册。由于志愿者是用户,因此用户应该能够编辑他的注册。您可以在as:user块中添加更多路由。