0

Deviseを使用してアプリケーションを開発しています。ユーザーを管理するには UI が必要なので、User モデルですべての CRUD 操作を実行するためのコントローラーと関連するビューも生成しました。

次に、CanCan で一括割り当てロールとして使用する「ロール」フィールドを作成します。

今、私はすべての仕様を適切に作ろうとしています、私はこのテストを持っています

describe "POST create" do
  describe "with valid params" do
    it "creates a new User" do
      expect {
        post :create, {:user => valid_attributes}
      }.to change(User, :count).by(1)
    end
    # ...
  end
end

実行されると、次の値が発生します。

UsersController POST create with valid params creates a new User
Failure/Error: post :create, {:user => valid_attributes}
ActiveModel::MassAssignmentSecurity::Error:
   Can't mass-assign protected attributes: name, surname, role
 # ./spec/controllers/users_controller_spec.rb:62:in `block (5 levels) in <top (required)>'
 # ./spec/controllers/users_controller_spec.rb:61:in `block (4 levels) in <top (required)>'

そして、コントローラーの #create メソッドが class UsersController < ApplicationController load_and_authorize_resource として定義されている場所

  # GET /users
  # GET /users.json
  def index
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @users }
    end
  end

  # GET /users/1
  # GET /users/1.json
  def show
    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @user }
    end
  end

  # GET /users/new
  # GET /users/new.json
  def new
    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @user }
    end
  end

  # GET /users/1/edit
  def edit
  end

  # POST /users
  # POST /users.json
  def create
    @user = User.new params[:user], :as => current_user.role.to_sym
    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'Utente creato con successo.' }
        format.json { render json: @user, status: :created, location: @user }
      else
        format.html { render action: "new" }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /users/1
  # PUT /users/1.json
  def update
    respond_to do |format|
     if @user.update_attributes(params[:user], :as => current_user.role.to_sym)
       format.html { redirect_to @user, notice: 'Profilo aggiornato con successo.' }
       format.json { head :no_content }
      else
       format.html { render action: "edit" }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

 # DELETE /users/1
  # DELETE /users/1.json
  def destroy
    @user.destroy

    respond_to do |format|
      format.html { redirect_to users_url }
      format.json { head :no_content }
    end
  end
end

rspec を Devise で適切に実行するために、公式ドキュメントに従い、マクロも作成しました (そこで説明されているものと同じです)。ただし、2 つの異なる FactoryGirl は持っていませんが、作成時にロールを定義するものは 1 つあります。例:

FactoryGirl.create(:user, role: :admin) # or role: :user

そして、これは User モデルです

class User < ActiveRecord::Base
  attr_accessible :email, :password, :password_confirmation, :remember_me
  attr_accessible :email, :password, :password_confirmation, :remember_me, :name, :surname, :role, :as => :admin

  devise :database_authenticatable, :recoverable, :rememberable, :trackable,
         :validatable

  VALID_ROLES = [:admin, :student]

  validates_inclusion_of :role, in: VALID_ROLES

  def is_admin?
    role == "admin"
  end

  def is_student?
    role == "student"
  end
end

どうすれば修正できますか?一日中かかり、これを機能させることができませんでした:-(

4

3 に答える 3

1

この問題は、ロールを含む ":as" 句を宣言することを許可せずにload_and_authorize_resource呼び出しているcancan が原因でした。User.create

修正は、実際には呼び出しを削除load_and_authorize_resourceし、通常の方法でリソースを作成することでした (cancan を使用しない場合と同様)。次に、#create 用の認証チェックを各メソッドで呼び出しauthorize! :create, Userます。

おそらく、次のようなものを使用して動作しload_and_authorize_resource :except => [:create]、そこでのみ手動で実行することもできますが、よくわかりませんし、テストもしていません。

ところで、私はこのバグで 1 日を失ってしまいました。これが同じ問題を抱えている他の誰かに役立つことを願っています。

于 2013-01-18T02:11:25.357 に答える
0

de'post'行のユーザーが間違っています。これを変える:

post :create, {:user => valid_attributes}

これに:

post :create, :user => {valid_attributes}

変数'valid_attributes'は、そのクラスの属性を持つハッシュであると想定しました。

于 2013-01-20T19:35:19.160 に答える
0

Rails バージョン 3.2 以降、セキュリティが実装されています。エラーを修正するには、次の行を User モデルに追加します。

attr_accessible :name, :surname, :role

詳細については、次のガイドを参照してください: http://guides.rubyonrails.org/security.html

于 2013-01-17T18:23:23.617 に答える