Rails,使用 Role Model gem 检查角色

Posted

技术标签:

【中文标题】Rails,使用 Role Model gem 检查角色【英文标题】:Rails, checking roles with Role Model gem 【发布时间】:2015-12-29 03:11:31 【问题描述】:

我正在尝试使用 Rails 4 制作应用程序。我使用引导程序、设计简单的表单和角色模型 gem。

profile.rb

class Profile < ActiveRecord::Base
  include RoleModel

  #reminder for roles (RoleModel): always add new roles to the end of this line - don't change the order
  roles :admin, :manager, 
        :student, :educator, :researcher, :ktp, :faculty_manager, :ip_asset_manager,  
        :sponsor, 
        :project_manager, :representative, # for both uni and industry
        :grantor, :investor, :adviser, :innovation_consultant, :panel_member,
        :participant, :guest, :pending

  # Other stuff goes here

end

然后在我的个人资料视图中,我有一个表单,我可以在其中询问用户来自哪里。我想根据用户的角色以不同的方式表达问题,并且我想根据该角色使用不同的选项数组。例如,如果当前用户是学生,则该数组应填充大学列表。

<div class="col-md-3 col-md-offset-1">
  <% if current_user.profile.has_any_role?(:student, :educator, :researcher, :ktp, :faculty_manager, :ip_asset_manager) %>
    <%= f.label  'Select your university',   :class => 'question-project' %>
  <% elsif current_user.profile.has_role?(:sponsor) %>                  
    <%= f.label  'Select your organisation',   :class => 'question-project' %>    
  <% elsif current_user.profile.has_any_role?(:grantor, :investor, :adviser, :innovation_consultant, :panel_member) %>  
  <% end %>                
</div>

<div class="col-md-7">
  <div class="response-project">
    <% if current_user.profile.has_any_role?(:student, :educator, :researcher, :ktp, :faculty_manager, :ip_asset_manager) %>                
      <%= f.collection_select :university_id, University.all, :id, :name, prompt: 'Select your university' %>
    <% elsif current_user.profile.has_role?(:sponsor) %>
      <%= f.collection_select :organisation_id, Organisation.all, :id, :name, prompt: 'Select your organisation' %>
    <% elsif current_user.profile.has_any_role?(:grantor, :investor, :adviser, :innovation_consultant, :panel_member) %>  
      <%= f.collection_select :firm_id, Firm.all, :id, :name, prompt: 'Select your organisation' %>
    <% else %>
      <%=  current_user.profile.id %>
    <% end %>

我有最后的 else 语句来证明以上所有方法都不起作用。当我尝试这个时,使用具有角色的用户:student,应该让我沿着第一条路线前进。它不起作用。我得到的是 user.profile.id。

谁能看到我做错了什么?

【问题讨论】:

&lt;%= puts current_user.profile.has_any_role?(:student, :educator, :researcher, :ktp, :faculty_manager, :ip_asset_manager) %&gt;什么是布尔值,请把结果粘贴到这里。 &lt;%= puts current_user.profile.has_role? :student %&gt;,这个o/p是什么? 什么也没给。如果我尝试不使用“puts”,我会得到错误的。如果我尝试在控制台中使用个人资料 ID,我会得到 role = student 【参考方案1】:

您忘记在模型类顶部添加require 'role_model'

更新

require 'rubygems'
require 'role_model'

class Profile < ActiveRecord::Base
  attr_accessor :roles_mask
  include RoleModel

  #reminder for roles (RoleModel): always add new roles to the end of this line - don't change the order
  roles_attribute :roles_mask

  roles :admin, :manager, 
    :student, :educator, :researcher, :ktp, :faculty_manager, :ip_asset_manager,  
    :sponsor, 
    :project_manager, :representative, # for both uni and industry
    :grantor, :investor, :adviser, :innovation_consultant, :panel_member,
    :participant, :guest, :pending

  # Other stuff goes here

end

在您的情况下,u.roles 为空:

> u.roles
=> #<RoleModel::Roles: > 

您需要从控制台分配角色:

u = User.first
> u.roles
=> #<RoleModel::Roles: > 
> u.roles= [:admin]
=> [:admin] 
> u.roles
=> #<RoleModel::Roles: :admin> 
> u.roles << :manager
=> #<RoleModel::Roles: :admin, :manager> 
> u.roles
=> #<RoleModel::Roles: :admin, :manager> 
> u.has_any_role? :author, :manager
=> true 

更多Reference

【讨论】:

嗨,我没有意识到你必须要求它以及包含它。我尝试了这个建议,但没有奏效。我仍然得到与原始问题相同的输出

以上是关于Rails,使用 Role Model gem 检查角色的主要内容,如果未能解决你的问题,请参考以下文章

Rails - Role_Model,删除分配给用户的角色

使用带有 Rails 的改革 gem,我如何填充 has_many :通过嵌套模型

rails查询mongodb通用查询

Rails错误 - 无法加载此类文件 - aws-sdk(您可能需要安装aws-sdk gem)

在 gem 中使用 rails 作为依赖项

设置 RSpec 以测试 gem(不是 Rails)