0

RailCasts のチュートリアル #274 で、Remember Me と Reset Password を見ました。彼が追加するコードは次のとおりですuser.rb

def send_password_reset
  generate_token(:password_reset_token)
  save!
  UserMailer.password_reset(self).deliver
end

def generate_token(column)
  begin
    self[column] = SecureRandom.urlsafe_base64
  end while User.exists?(column => self[column])
end

ここで私が理解できないのは、なぜsave!内部で呼び出しが行われるのsend_password_resetですか? また、私はgenerate_token:の構文に慣れていませんself[column]=。これは、データベース テーブル内に列を設定する方法ですか?

createのアクションはこちらpassword_resets_controller

  def create
    user = User.find_by_email(params[:email])
    user.send_password_reset if user
    redirect_to root_path, notice: "Email sent with password reset instructions."
  end
4

2 に答える 2

5

save!オブジェクトを保存し、失敗した場合は例外を発生させます。


self[column]=、わずかなメタプログラミングです。

通常、列名がわかっている場合は、次のようにしますself.password_reset_token=self[:password_reset_token]=またはと同じself["password_reset_token"]=です。

したがって、列名を文字列/シンボルとして渡すことで簡単に抽象化できます。

より明確ですか?

于 2012-10-07T19:52:54.110 に答える
1

1)save!に似saveていますが、レコードが有効でない場合RecordInvalidに戻る代わりに例外を発生させます。false

私のコンソールからの例:

User.new().save  # => false 
User.new().save! # ActiveRecord::RecordInvalid: Validation failed: Password can't be blank,  Email can't be blank

2)self[column]=ユーザー列を設定するためのものです。

于 2012-10-07T19:53:52.097 に答える