0

我观看了关于记住我和重置密码的 RailCast 教程 #274。他添加的代码如下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]=与or相同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 回答