0

Rails 3.2に搭載されたdeviseとcarrierwaveを使用して、gems cancanを実装するのに問題があります。

現在、ユーザーは自分のユーザー ページ (番組) にのみ画像をアップロードできるようにしたいと考えています。現時点では、すべての登録ユーザーを含むユーザー インデックス ページがあります。これらのそれぞれにアクセスして、ユーザー ロール (管理者ではない) だけで各プロファイルに画像を追加できます。自分のプロフィールに対してのみこれを実行し、他のプロフィール ページ ([写真の追加] リンクを除く) のみを効果的に読み取ることができるようにしたいのです。私のコードは以下の通りです:

   class Ability
  include CanCan::Ability

  def initialize(user)
    # Define abilities for the passed in user here. For example:
    #


       user ||= User.new # guest user (not logged in)
       if user.has_role? :user
       can :read, User
       can [:new, :create] , Photo, user_id: user.id
       end
  end

class UsersController < ApplicationController

      before_filter :authenticate_user!


      def index
        @users = User.all
      end

        def show
          @user = User.find(params[:id])
          @photo = Photo.new(params[:user_id])
        end
    end

権限のあるコントローラへの編集!

class PhotosController < ApplicationController
  before_filter :authenticate_user!

  def new

    @photo = Photo.new(:user_id => params[:user_id])
    authorize! :new, @photo
  end

  def create

    @photo = Photo.new(params[:photo])
    if @photo.save
      flash[:notice] = "Successfully created photo."
      redirect_to @photo.user
    else
      render :action => 'new'
    end
    authorize! :create, @photo
  end

  def edit
    @photo = Photo.find(params[:id])
  end

  def update
    @photo = Photo.find(params[:id])
    authorize! :update, @user
    if @photo.update_attributes(params[:photo])
      flash[:notice] = "Successfully updated photo."
      redirect_to @photo.user
    else
      render :action => 'edit'
    end
  end

  def destroy
    authorize! :destroy, @user
    @photo = Photo.find(params[:id])
    @photo.destroy
    flash[:notice] = "Successfully destroyed photo."
    redirect_to @photo.user
  end
end

ActiveRecord::Schema.define(:version => 20130512100231) do

  create_table "photos", :force => true do |t|
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
    t.string   "image"
    t.integer  "user_id"
  end

  create_table "posts", :force => true do |t|
    t.string   "title"
    t.text     "body"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

  create_table "roles", :force => true do |t|
    t.string   "name"
    t.integer  "resource_id"
    t.string   "resource_type"
    t.datetime "created_at",    :null => false
    t.datetime "updated_at",    :null => false
  end

  add_index "roles", ["name", "resource_type", "resource_id"], :name => "index_roles_on_name_and_resource_type_and_resource_id"
  add_index "roles", ["name"], :name => "index_roles_on_name"

  create_table "users", :force => true do |t|
    t.string   "email",                  :default => "", :null => false
    t.string   "encrypted_password",     :default => "", :null => false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          :default => 0
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at",                             :null => false
    t.datetime "updated_at",                             :null => false
    t.string   "name"
    t.string   "avatar"
    t.string   "image"
  end

  add_index "users", ["email"], :name => "index_users_on_email", :unique => true
  add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true

  create_table "users_roles", :id => false, :force => true do |t|
    t.integer "user_id"
    t.integer "role_id"
  end

  add_index "users_roles", ["user_id", "role_id"], :name => "index_users_roles_on_user_id_and_role_id"

end
4

1 に答える 1

2

これがCanCanの目的です。インストールはしましたが、構成していません。

can :manage, Photo, user_id: user.id

参照:マニュアル

authorize!さらに、アクセスを制限したい各コントローラー アクションで呼び出していることを確認する必要があります。例えば:

authorize! :create, @photo

私は使用するauthorize_resourceload_and_authorize_resource、アクションを見逃していないことを確認することを好みますが、使用するだけでauthorize!コードに最小限の変更が必要になります.

于 2013-05-12T16:55:44.080 に答える