1

我想知道处理用户注册哪种类型的用户最合乎逻辑的方式是什么?

当用户注册他们的说:

name, email, password

他们被重定向到另一个页面,询问他们有兴趣注册哪个角色:

business or resident

我应该在他们数据库的用户表中分配一个新列吗?string :role? 或者我应该创建一个新表?什么宝石最适合处理这样的事情?最终我想根据用户的角色输出不同的视图布局

谢谢

4

2 回答 2

4

正如我所说的那样,最好的宝石是 CanCan,因为它允许您根据需要更改角色。能够过滤出针对不同角色的特定操作。为此,我建议执行以下操作:

1. 添加角色

rails g scaffold Role name:string 

2.角色和用户的HABTM关系

rails generate migration UsersHaveAndBelongsToManyRoles

class UsersHaveAndBelongsToManyRoles < ActiveRecord::Migration
  def self.up
    create_table :roles_users, :id => false do |t|
      t.references :role, :user
    end
  end

  def self.down
    drop_table :roles_users
  end
end

3.修改Role模型,如下图

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users
end

4.改变用户模型

将 :role_ids 添加到 attr_accessible 以便您可以添加以下方法来识别特定用户的角色。

 class User < ActiveRecord::Base
  has_and_belongs_to_many :roles

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :username, :password, :password_confirmation, 
  :remember_me, :role_ids

  def role?(role)
    !!self.roles.find_by_name(role.to_s.camelize)
  end
end

5. 播种角色

%w(Business Administrator Resident).each { |role| Role.create!(:name => role) }

以上是角色的文字数组

所以你可以做这样的事情作为例子:

b = User.create!(:email => "example@example.com",
                 :password => "pass",
                 :password_confirmation => "pass",
)
b.roles << Role.first
b.save

6. 报名表

您的注册表可能如下所示,这是一个示例:

<%= form_for(@user) do |f| %>
  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %>
           prohibited this user from being saved:</h2>

      <ul>
        <% @user.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>
  <div class="field">
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </div>
  <% if @current_method == "new" %>
    <div class="field">
      <%= f.label :password %><br />
      <%= f.password_field :password %>
    </div>
    <div class="field">
      <%= f.label :password_confirmation %><br />
      <%= f.password_field :password_confirmation %>
    </div>
  <% end %>
  <% for role in Role.find(:all) %>
    <div>
      <%= check_box_tag "user[role_ids][]", 
           role.id, @user.roles.include?(role) %>
      <%= role.name %>
    </div>
  <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

上面的表格将允许用户选择他们的角色。

6. 迁移你的数据库 rake db:migrate

7. 使用 CanCan 定义权限

ability使用 - rails g cancan:ability生成类

能力.rb

class Ability
  include CanCan::Ability
  def initialize(user)
    user ||= User.new # guest user

    if user.role? :administrator

      can :manage, :all
      can :manage, User

    elsif user.role? :business
      can [:create, :new], Business
      can [:show, :update], User, :id => user.id 

    else user.role? :resident 
     can [:show, :update], User, :id => user.id

    end
  end
end

正如您所说,您希望向不同的用户显示页面的不同部分。因此,您可能对特定视图有以下看法if-else

示例视图

  <% if current_user.role? business %> 

     #Show stuff visible to business user

   <% else current_user.role? resident %> 

      #Show stuff visible to resident user

 <% end %> 

希望这可以让您清楚地了解您想要做什么

过滤器示例:

 def admin_business_user
    redirect_to dashboard_path, :notice => 
    'You must be an admin to do that!' 
          unless current_user.role? :administrator || :business 
  end
于 2013-06-09T16:44:26.913 回答
1

如果您只拥有 2 个角色,那么在您的用户模型中添加一列可能是最简单的。

rails generate migration add_business_to_users business:boolean

然后在迁移中为该列添加一个默认值,例如

class AddBusinessToUsers < ActiveRecord::Migration
  def change
    add_column :users, :business, :boolean, default: false
  end
end

将其迁移到数据库后,您就拥有了 2 个角色所需的一切。例如,您始终可以使用

user.business? #This will be true for a user that is a business and false for resident

您实际上假设的是,每个不是企业的用户都是居民。

如果您要拥有更多角色,那么拥有一个单独的角色模型或使用像 cancan 这样的 gem 是有意义的。

于 2013-06-09T16:32:53.730 回答