Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Desive中多个模型上的同一当前用户 问题_Ruby On Rails_Devise - Fatal编程技术网

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,声明性授权,但它被大量扩展