Devise + Declarative_authorization + role_model +不同的用户模型名称:未定义的方法`current_user'

时间:2012-10-28 10:48:11

标签: devise customization declarative-authorization

我确实有这个着名的错误:“undefined method`current_user'”和声明式授权,尽管我在application_controller.rb中设置了这个变量:

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_current_user

  protected

    def set_current_user
      Authorization.current_user = current_admin_utilisateur
    end
end

我正在使用名为“ admin_utilisateurs ”而非“用户”的表格。这是在Devise中激活的:“rails generate devise admin_utilisateur”

设计工作很棒

有关信息,我使用“roles_model”gem定制了我的用户表(admin_utilisateurs),因此我确实有一个attribut roles_mask,允许我管理不同的角色,同时为声明性授权提供role_symbols方法。

现在的问题是,虽然Authorization.current_user是由application_controller.rb设置的,但我收到了这个奇怪的错误。

这是我的资源控制器产生错误的原因:

class PubResponsablesController < ApplicationController

  before_filter :authenticate_admin_utilisateur!
  filter_resource_access

  ...
end

我通过谷歌搜索此错误,但结果都没有提供可行的解决方案。 有人可以帮我吗?

非常感谢

2 个答案:

答案 0 :(得分:2)

好的,这是最后的答案。

我修改了我的app / controller / application_controller.rb,因为我没有在视图中使用@current_user实例变量:

class ApplicationController < ActionController::Base
  protect_from_forgery

  # This is mandatory if you want to secure as well your app/models
  before_filter :set_current_user

  # This method is required by declarative_authorization on every controller
  #  that is using filter_resource_access (or any other declarative_auth.. mechanism)
  def current_user
    current_admin_utilisateur
  end

  protected

  def set_current_user
    Authorization.current_user = current_admin_utilisateur
  end
end

正如我所说,我正在合作使用以下宝石:

gem devise 用于身份验证 用户模型名称是“admin_utilisateur”而不是“user”,但它可能是:帐户,成员,组或您需要的。

gem role_model 为我的用户模型提供一个明智的角色方法“role_symbols” *方法role_symbols返回一个“Set”子类而不是“Array”,但在Github上快速发布后,开发人员(martinrehfeld)在几分钟之内修复了这个兼容性问题。太棒了!*

gem declarative_authorization ,提供基于角色的访问管理。 我将使用与“用户”不同的型号名称来确认使用以下post

declarative_authorization唯一需要的是每个控制器上的 current_user 方法。由于我正在使用与Devise不同的模型名称(例如admin_utilisateur,account,member,...),因此由devise创建的帮助程序具有不同的名称。而不是current_user,它是current_admin_utilisateur(或current_account,current_member)。所以我必须创建自己的current_user方法。

declarative_authorization所需的 role_symbols 方法由role_model gem提供。

我希望这会有助于其他开发者,因为我花了两天的时间来理清这些结构如何协同工作。 Devise在路由问题上给了我更多。

我的几分钱给RoRrrr; - )

答案 1 :(得分:0)

好的,我设法通过修改我的app / controller / application_controller.rb来解决这个错误:

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_current_user

  def current_user
    @current_user = current_admin_utilisateur
  end

  protected

    def set_current_user
      Authorization.current_user = current_admin_utilisateur
    end
end

我刚创建了自己的current_user方法,用于创建实例变量@current_user。这个是使用current_admin_utilisateur的值初始化的,该值基于Devise助手和我的自定义用户模型admin_utilisateur。 (我的模型也可以称为会员,会员或其他......

我将current_user方法放在application_controller中,以便它可以在我的应用程序的每个控制器中使用。

现在,我又收到了另一个错误:

User.role_symbols doesn't return an Array of Symbols (#<RoleModel::Roles: {:developer, :admin, :coordinator, :manager, :assistant, :distributor, :exporter, :historian}>)

我不明白,因为roles_model gem为admin_utilisateur模型提供别名方法'role_symbols'。