0

CanCanを使用する私のアプリケーションでは、ユーザーがストアを表示および作成できる権限を持っていますが、ユーザーが作成したストアのみを編集できるようにすることも必要です。ユーザーは好きなだけストアを作成できますが、それらはすべてユーザーが編集できる必要があります。ストアにはユーザーがいないので、テーブルuser_idから離れていないときにこれを行うにはどうすればよいですか?Store

カンカン:

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

ストアモデルに次を追加します。

has_one :created_by, :class => User

次に、移行を追加して、created_by_idをStoreクラスに追加します。

これで、CanCan :: Ability:を追加できるようになります。

can :edit, Store, :created_by => user
于 2012-05-30T20:01:34.287 に答える
1

以前のポスターに同意します。との間の関係を設定する必要がUserありStoreます。関係は、1対多(Kleber S.が示したように)、またはストアに複数のユーザーがいる場合は多対多にすることができます。

次に、アクセス制御を処理する最良の方法は、アソシエーションを使用してコントローラーで行うことです。、、、メソッドの場合show、ログインしているユーザーを指定してストアを見つける必要があるため、次のようにします。editupdatedestroy

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このように、アソシエーションは、外部キーによって接続されているストアのみにルックアップを制限するように処理します。これは、RESTfulRailsリソースが関連するリソースのアクセス制御を実行するための標準的な方法です。

于 2012-06-05T22:44:21.243 に答える