繁体   English   中英

Rails Cancan能力.rb

[英]Rails cancan ability.rb

并开始学习康康+设计

我有“用户”表(设计)

我有“职位”表(带有“ user_id”字段)

我有“角色”表(带有“名称”字段)

  • 1-管理员
  • 2-用户

我有users_roles(带有'user_id'和'role_id')

我以“用户”角色创建了2个用户

并创建1个具有“ admin”角色的用户

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

在我的views / posts / 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),如果用户未登录(来宾)-只能读取

但我不知道如何更改我的能力。

  • 我有客人(只看)
  • 我有用户(可以读取和创建,更新,销毁(如果他是导师))
  • 我有一个管理员(可以读取,创建,更新,销毁)

注意我已经有角色表(具有2个角色)和3个用户(1个具有admin角色,2个具有user角色)

这就是我在应用程序中实现cancan来管理角色和来宾用户的方式。

只需使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM