0

在我使用CanCan的应用程序中,我拥有用户可以查看和创建商店的权限,但我也希望他们只能编辑他们创建的商店。用户可以创建任意数量的商店,所有商店都应该由他们编辑。商店没有用户,所以当他们没有桌子时我怎么能这样user_idStore

可以可以:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new 
    if user.role == "default"
      can :read, Store
      can :create, Store
    end
  end
end
4

3 回答 3

3

由于用户将能够创建任意数量的商店,因此商店将属于用户。

您必须创建这种关系。

所以,在User模型中。

class User < ActiveRecord::Base
  has_many :stores
end

并在Store模型中。

class Store < ActiveRecord::Base
   belongs_to :user
end

ability.rb文件中,只需输入以下内容:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.role == 'default'
      can :manage, Store , :user_id => user.id
    end
  end
end
于 2012-06-03T03:30:24.403 回答
1

User我同意以前的海报,即您必须在和之间建立关系Store。如果商店可以有多个用户,这种关系可以是一对多(如 Kleber S. 所示)或多对多。

然后,处理访问控制的最佳方式是在控制器中,通过使用关联。对于show, edit, update,destroy方法,您需要在给定登录用户的情况下找到商店,因此请执行以下操作:

class StoresController < ApplicationController
  before_filter :find_store, only: [:show, :edit, :update, :destroy]

  def show
  end

  def edit
  end

  def update
    if @store.update_attributes(params[:store])
      # redirect to show
    else
      # re-render edit, now with errors
    end
  end

  # ...

  private

  def find_store
    @store = current_user.stores.find(params[:id])
  end
end

这样,关联会负责将查找限制为仅连接到current_user外键的那些商店。这是 RESTful Rails 资源执行关联资源访问控制的标准方式。

于 2012-06-05T22:44:21.243 回答
1

我会将以下内容添加到商店模型中:

has_one :created_by, :class => User

然后添加迁移以将 created_by_id 添加到您的 Store 类。

然后,您应该能够添加 CanCan::Ability:

can :edit, Store, :created_by => user
于 2012-05-30T20:01:34.287 回答