1

私は、Michael Hartl の学習用 Rails チュートリアルを終えたばかりの Rails 初心者です。なんて素晴らしい男だ!

この 5 時間の私の目標は、ユーザー編集ページでパスワード更新プロセスの一環として、ユーザーに古いパスワードを入力させることでした。

これは私が得た限りです。

このフィールドを (sample_app) edit.html.erb ページに追加しました。

  <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
  <%= f.password_field :current_password %>

また、以下のように「current_password」で user.rb を更新しました

class User < ActiveRecord::Base
attr_accessible :name, :email, :current_password, :password, :password_confirmation, 

これは、私が取得している現在のサーバー側のエラー メッセージです (エラー メッセージを 100 回ググってみました)。

"ActiveRecord::UnknownAttributeError in UsersController#update

unknown attribute: current_password
Rails.root: /Users/nicolemcnight/rails_projects/sample_app

Application Trace | Framework Trace | Full Trace
app/controllers/users_controller.rb:55:in `update'"

明らかに、users_controller に何か問題があります。具体的には、現在次のようになっている「def update」です。

def update
  if @user.update_attributes(params[:user])
    flash[:success] = "Profile updated"
    sign_in @user
    redirect_to @user
  else
    render 'edit'
  end
end

current_password私の質問は、属性を含めるために「def update」にどのような変更を加える必要があるかです!? 他に必要な更新はありますか?

基本的に、ユーザー編集ページで新しいパスワードを入力 (および確認) する前に、古いパスワードを確認するようユーザーに強制するだけです。

ここでどこが間違っていますか?

どんな助けでも大歓迎です!

ここに私のgithubがあります

https://github.com/mwcahn/sample_app

ありがとう!

4

2 に答える 2

0

:current_password を attr_accessor に追加する必要があります。attr_accessible ではありません。これらは 2 つの非常に異なるものです。そのまま

attr_accessor :current_password
attr_accessible :name, :email, ... etc

current_password は User モデルの有効な属性になりました。

とはいえ、更新前にパスワード チェックを行うようにするには、モデルにコードを追加する必要があります。何かのようなもの

before_update :confirm_passwords

def confirm_passwords
    if current_password != password
        errors.add(:current_password, "Does not match password")
    end
end

上記のコードはデモ用であることに注意してください。データベース内の実際のパスワード値は暗号化されている/暗号化されるべきです。したがって、 current_password != password だけを実行することはできません。パスワードに使用したのと同じ暗号化で current_password を変換し、その値を比較する必要があります。Rails のデフォルトの has_secure_password を使用している場合、これは機能するはずです (ただしテストはされていません) -

def confirm_passwords
    errors.add(:current_password, "Does not match password") unless self.authenticate(current_password)
end
于 2012-08-05T07:50:11.080 に答える
-1

もう 1 つのチェック: データベース
rails generate migration add_current_password_to_user current_password:string
rake db:migrate
の移行を忘れた場合に備えて行ったことを確認してください。

于 2012-08-05T08:05:57.437 に答える