我想知道处理用户注册哪种类型的用户最合乎逻辑的方式是什么?
当用户注册他们的说:
name, email, password
他们被重定向到另一个页面,询问他们有兴趣注册哪个角色:
business or resident
我应该在他们数据库的用户表中分配一个新列吗?string :role
? 或者我应该创建一个新表?什么宝石最适合处理这样的事情?最终我想根据用户的角色输出不同的视图布局
谢谢
我想知道处理用户注册哪种类型的用户最合乎逻辑的方式是什么?
当用户注册他们的说:
name, email, password
他们被重定向到另一个页面,询问他们有兴趣注册哪个角色:
business or resident
我应该在他们数据库的用户表中分配一个新列吗?string :role
? 或者我应该创建一个新表?什么宝石最适合处理这样的事情?最终我想根据用户的角色输出不同的视图布局
谢谢
正如我所说的那样,最好的宝石是 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
如果您只拥有 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 是有意义的。