Ruby on rails Desive中多个模型上的同一当前用户 问题
我有一个用户模型和从用户模型继承的志愿者模型:Ruby on rails Desive中多个模型上的同一当前用户 问题,ruby-on-rails,devise,Ruby On Rails,Devise,我有一个用户模型和从用户模型继承的志愿者模型: class User < ActiveRecord::Base end class Volunteer < User end 这很好用,但是我使用的授权系统依赖于当前的用户助手。这对于志愿者来说是失败的,因为Deave为志愿者模型创建了当前的志愿者 我尝试的是为:志愿者设置design_,:singular=>user,这会创建一个当前的_用户,它引用用户和志愿者,但现在的问题是志愿者的路线混乱了 问题 所以我的问题是,有没有办法让
class User < ActiveRecord::Base
end
class Volunteer < User
end
这很好用,但是我使用的授权系统依赖于当前的用户助手。这对于志愿者来说是失败的,因为Deave为志愿者模型创建了当前的志愿者
我尝试的是为:志愿者设置design_,:singular=>user,这会创建一个当前的_用户,它引用用户和志愿者,但现在的问题是志愿者的路线混乱了
问题
所以我的问题是,有没有办法让当前的用户助手引用用户以外的其他模型?我认为这种方式允许用户作为用户和voliveer在同一会话中登录 一旦你有了解决问题的方法,你能不能
# in application_controller.rb
alias_method :devise_current_user, :current_user
def current_user
devise_current_user || current_volunteer
end
在您的应用程序中_controller.rb我认为这种方式允许用户作为用户和voliveer在同一会话中登录 一旦你有了解决问题的方法,你能不能
# in application_controller.rb
alias_method :devise_current_user, :current_user
def current_user
devise_current_user || current_volunteer
end
在您的应用程序_controller.rb中,我遇到了类似的问题,并这样解决了它。但是这个解决方案是针对坎坎宝石的 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
我也遇到了类似的问题,就这样解决了。但是这个解决方案是针对坎坎宝石的 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
我接受了维克多·特隆的回答,因为这似乎是最干净的方法 然而,我以不同的方式解决了我的问题 最后,我将其他类的登录过程硬编码为: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
我接受了维克多·特隆的回答,因为这似乎是最干净的方法 然而,我以不同的方式解决了我的问题 最后,我将其他类的登录过程硬编码为: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
可能有点晚,但您可以在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块中添加更多路由。可能有点晚,但您可以在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块中添加更多路由。您是否使用了cancan授权gem?@Suborx,声明性授权,但它被大量扩展?您是否使用了cancan授权gem?@Suborx,声明性授权,但它被大量扩展