1

cancan+deviseを学び始める

「ユーザー」テーブルがあります(デバイス)

「posts」テーブルがあります(「user_id」フィールド付き)

私は「役割」テーブルを持っています(「名前」フィールド付き)

  • 1 - 管理者
  • 2 - ユーザー

私はusers_rolesを持っています(「user_id」と「role_id」を使用)

「ユーザー」ロールを持つ2人のユーザーを作成します

「管理者」ロールを持つ1人のユーザーを作成します

user.rb
  has_many :posts
  has_many :users_roles
  has_many :roles, :through => :users_roles

role.rb
  has_many :users_roles
  has_many :users, :through => :users_roles

users_role.rb
  belongs_to :user
  belongs_to :role

そして質問があります:

i create ability.rb 

  def initialize(user)
    user ||= User.new
    if user.persisted?
        #loged in
        can :read, Post
        can :create, Post
        can :update, Post , :user_id => user.id
        can :destroy, Post , :user_id => user.id
    else
        #not logged
        can :read, Post
    end

私のビュー/投稿/index.html.erbで

<% @posts.each do |post| %>
  <tr>
    <td><%= post.user.email %></td>
    <td><%= post.title %></td>
    <td><%= post.text %></td>
    <td><%= link_to 'Show', post %></td>
      <% if can? :update, Post %>
        <% if current_user.id == post.user.id %>
          <td><%= link_to 'Edit', edit_post_path(post) %></td>
        <% end %>  
      <% end %>
      <% if can? :destroy, Post %>
        <% if current_user.id == post.user.id %>
          <td><%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %></td>
        <% end %>
    <% end %>  
  </tr>

<% end %>
</table>

<br />
<!-- ???почему Post ? -->
<% if can? :create, Post %>
  <%= link_to 'New Post', new_post_path %>
<% end %>  

この場合、ユーザーがログインしているかどうかを確認します-彼は読み取りと作成、更新、破棄ができます(彼が autor の場合)、ユーザーがログインしていない場合(ゲスト)-読み取りのみ可能

しかし、それを行うために自分のability.rbを変更する方法がわかりません:

  • 私はゲストを持っています(読むだけ)
  • 私にはユーザーがいます(読み取りと作成、更新、破棄が可能です(彼がautorの場合))
  • 管理者が 1 人います (読み取り、作成、更新、破棄できます)

私はすでにロールテーブル(2つのロールを持つ)と3人のユーザー(管理者ロールを持つ1人、ユーザーロールを持つ2人)を持っていることに注意してください

4

1 に答える 1

1

これは、アプリケーションに cancan を実装してロールとゲスト ユーザーを管理する方法です。

a を使用しif user.role == role て、ユーザーが適切な役割を持っていることを確認します。

class Ability
include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user
    if user.role == "author"
      # 
      can :read, Post
      can :create, Post
      can :update, Post , :user_id => user.id
      can :destroy, Post , :user_id => user.id

      # a simple way to realize read create update and destroy is :manage
      # can :manage, Post, :user_id => user.id

    else
      if user.role == "admin"
        # User with role admin can manage all on all models 
        can :manage, :all
      else
        # Guest user can only read something
        can :read, Post
        # or
        # can :read, [SomeModel1, Somemodel2]
        # can :read, :all     # this means he can read all models 
end
于 2012-09-16T10:36:32.687 に答える