0

認証に authlogic を使用し、このチュートリアルを使用しています。rubyDocsも参照しました。私が正しく理解している場合、attr_protected メソッドは、一括割り当てのために属性のリストにアクセスできないことを保証します。そして、モデル属性を保護しています。また、config/application.rb のホワイトリスト フラグを false に変更しようとしましたが、違いはありませんでした。

ユーザーモデルに password と password_confirmation という属性がないことが原因ではないかと思います。チュートリアルにはこうある

フィールド名を :crypted_pa​​ssword から :password に変更しました。Authlogic は、ハッシュ後に :password フィールドを :crypted_pa​​ssword にマップします。また、フィールド タイプを f.text_field から f.password_field に変更しました。これにより、プレーン テキスト入力フィールドではなく、標準のパスワード入力フィールドが作成されます。:password_confirmation フィールドも追加しました。これらのフィールドをサポートするすべてのロジックは、authlogic に組み込まれています。

これはまだ本当ですか?この問題を解決する方法について何か提案はありますか?

レール: 3.2.12

ルビー: 1..9.3

ActiveModel::MassAssignmentSecurity::Error in UsersController#create

Can't mass-assign protected attributes: password, password_confirmation

{"utf8"=>"✓",
 "authenticity_token"=>"WUw09PvSlIxLUBFFsi1hiK6v0Y3nn7wqkjH3seCkU34=",
 "user"=>{"username"=>"test",
 "email"=>"test",
 "password"=>"[FILTERED]",
 "password_confirmation"=>"[FILTERED]"},
 "commit"=>"Create User"}

以下は私のモデルとコントローラーです

モデル

class User < ActiveRecord::Base
  attr_accessible :crypted_password, :email, :password_salt, :persistence_token, :username
end

コントローラ

def create
    @user = User.new(params[:user])

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        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

FORM.html

div class="field">
    <%= f.label :username %><br />
    <%= f.text_field :username %>
  </div>
  <div class="field">
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </div>
  <div class="field">
    <%= f.label :password %><br />
    <%= f.password_field :password %>
  </div>
  <div class="field">
      <%= f.label :password_confirmation %><br />
      <%= f.password_field :password_confirmation %>
    </div>

ありがとう

4

1 に答える 1

1

おっしゃるように、属性は保護されているため、一括で割り当てることはできません。attr_accessibleリストに追加して、それらにアクセスできるようにします

class User < ActiveRecord::Base
  attr_accessible :crypted_password, :email, :password_salt, :persistence_token, :username, :password, :password_confirmation
end

:crypted_password注:またはのような機密データをそのリストから削除することもできます:password_salt

class User < ActiveRecord::Base
  attr_accessible :email, :persistence_token, :username, :password, :password_confirmation
end
于 2013-03-17T17:37:55.247 に答える