Ruby on rails 使用RoR处理用户注册角色?
我想知道,处理用户注册的用户类型最合理的方式是什么 当用户注册他们的帐户时,可以说: 姓名、电子邮件、密码 他们会被重定向到另一个页面,询问他们对注册哪个角色感兴趣: 企业或居民 我应该在数据库的users表中分配一个新列吗?字符串:角色?或者我应该创建一个新表?那么什么宝石最适合处理这样的事情呢?最终,我希望根据用户的角色输出不同的视图布局Ruby on rails 使用RoR处理用户注册角色?,ruby-on-rails,ruby-on-rails-3.2,Ruby On Rails,Ruby On Rails 3.2,我想知道,处理用户注册的用户类型最合理的方式是什么 当用户注册他们的帐户时,可以说: 姓名、电子邮件、密码 他们会被重定向到另一个页面,询问他们对注册哪个角色感兴趣: 企业或居民 我应该在数据库的users表中分配一个新列吗?字符串:角色?或者我应该创建一个新表?那么什么宝石最适合处理这样的事情呢?最终,我希望根据用户的角色输出不同的视图布局 谢谢如果您只有两个角色,那么向您的用户模型中添加列可能是最简单的 rails generate migration add_business_to_use
谢谢如果您只有两个角色,那么向您的用户模型中添加列可能是最简单的
rails generate migration add_business_to_users business:boolean
然后在迁移过程中,向该列添加一个默认值,如
class AddBusinessToUsers < ActiveRecord::Migration
def change
add_column :users, :business, :boolean, default: false
end
end
您实际上假设的是,不是企业的每个用户都是居民
如果你想拥有更多的角色,那么有一个单独的角色模型或者使用像cancan这样的gem是有意义的 如果您只有两个角色,那么向您的用户模型中添加列可能是最简单的
rails generate migration add_business_to_users business:boolean
然后在迁移过程中,向该列添加一个默认值,如
class AddBusinessToUsers < ActiveRecord::Migration
def change
add_column :users, :business, :boolean, default: false
end
end
您实际上假设的是,不是企业的每个用户都是居民
如果你想拥有更多的角色,那么有一个单独的角色模型或者使用像cancan这样的gem是有意义的 正如我所说的,对于这样的东西来说,最好的宝石是CanCan,因为它允许你根据自己的意愿改变自己的角色。能够为不同的角色筛选出特定的操作。为此,我建议采取以下措施: 一,。添加角色 二,。HABTM角色和用户之间的关系 上面是角色的文本数组 例如,你可以这样做:
b = User.create!(:email => "example@example.com",
:password => "pass",
:password_confirmation => "pass",
)
b.roles << Role.first
b.save
<%= 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 %>
def admin_business_user
redirect_to dashboard_path, :notice =>
'You must be an admin to do that!'
unless current_user.role? :administrator || :business
end
正如您所说的,您希望向不同的用户显示页面的不同部分。因此,在一个特定视图上,您可能会看到以下内容
示例视图
正如我所说的,对于这样的事情来说,最好的宝石是CanCan,因为它允许你根据自己的意愿改变自己的角色。能够为不同的角色筛选出特定的操作。为此,我建议采取以下措施: 一,。添加角色 二,。HABTM角色和用户之间的关系 上面是角色的文本数组 例如,你可以这样做:
b = User.create!(:email => "example@example.com",
:password => "pass",
:password_confirmation => "pass",
)
b.roles << Role.first
b.save
<%= 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 %>
def admin_business_user
redirect_to dashboard_path, :notice =>
'You must be an admin to do that!'
unless current_user.role? :administrator || :business
end
正如您所说的,您希望向不同的用户显示页面的不同部分。因此,在一个特定视图上,您可能会看到以下内容
示例视图
我相信最好的方法就是使用CanCan-。我相信一些关于角色的东西。这允许您在能力类中定义角色。从定义你的角色开始。然后,您可以在控制器中添加if-else,以检查用户的角色。根据他们的角色,这会将他们重定向到不同的页面。角色是否始终是业务/居民?您可以定义自己的角色roles@David我会调查cancan。@JSWorld是的,因为用户只能是企业主,也只能是居民。我认为,实现这种功能的最佳方式是使用cancan-。我相信一些关于角色的东西。这允许您在能力类中定义角色。从定义你的角色开始。然后,您可以在控制器中添加if-else,以检查用户的角色。根据他们的角色,这会将他们重定向到不同的页面。角色是否始终是业务/居民?您可以定义自己的角色roles@David我会调查cancan@JSWorld是的,因为用户只能是企业主,也只能是居民谢谢David!这是很大的帮助!我想弄明白,为什么不显示角色的复选框?我必须先在数据库中添加角色名称吗?@andrewliu请参阅对步骤2和步骤5的修订。步骤2我已经添加了迁移的外观。步骤5我已经添加了文字数组。@andrewliu您知道,如果我们愿意,我们可以更进一步。一旦你定义了你的角色,它就会变得更好。您可以在应用程序控制器中编写一个方法来过滤控制器中的操作。我会提供一个例子。很好的答案!快速提问,我正试图找出将您所指的种子代码放在哪里?由于某些原因,它没有在我的注册表中显示选项。很抱歉问了这么多愚蠢的问题,我还是n00b!谢谢你,大卫!这是很大的帮助!我想弄明白,为什么不显示角色的复选框?我必须先在数据库中添加角色名称吗?@andrewliu请参阅对步骤2和步骤5的修订。步骤2我已经添加了迁移的外观。步骤5我已经添加了文字数组。@andrewliu您知道,如果我们愿意,我们可以更进一步。一旦你定义了你的角色,它就会变得更好。您可以在应用程序控制器中编写一个方法来过滤控制器中的操作。我会的
提供一个例子。很好的答案!快速提问,我正试图找出将您所指的种子代码放在哪里?由于某些原因,它没有在我的注册表中显示选项。很抱歉问了这么多愚蠢的问题,我还是n00b!
<%= 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 %>
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 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