Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用RoR处理用户注册角色?_Ruby On Rails_Ruby On Rails 3.2 - Fatal编程技术网

Ruby on rails 使用RoR处理用户注册角色?

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

我想知道,处理用户注册的用户类型最合理的方式是什么

当用户注册他们的帐户时,可以说:

姓名、电子邮件、密码

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

企业或居民

我应该在数据库的users表中分配一个新列吗?字符串:角色?或者我应该创建一个新表?那么什么宝石最适合处理这样的事情呢?最终,我希望根据用户的角色输出不同的视图布局


谢谢

如果您只有两个角色,那么向您的用户模型中添加列可能是最简单的

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