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