1

ユーザーがサインアップするユーザーのタイプを処理する最も論理的な方法は何でしょうか?

ユーザーが発言を登録したとき:

name, email, password

彼らは別のページにリダイレクトされ、サインアップに関心のある役割を尋ねられます。

business or resident

データベースの users テーブルに新しい列を割り当てるだけですか? string :role? または、新しいテーブルを作成する必要がありますか? そして、このようなものを処理するのに最適な宝石は何ですか? 最終的には、ユーザーの役割に応じて異なるビュー レイアウトを出力したいと考えています。

ありがとう

4

2 に答える 2

4

前述したように、このようなものに最適な gem は 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 に答える