不了解RailsCast教程中的一些代码

mai*_*aik 0 ruby-on-rails ruby-on-rails-3

我在"记住我"和"重置密码"上观看了RailCasts教程#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
Run Code Online (Sandbox Code Playgroud)

这里我不明白为什么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
Run Code Online (Sandbox Code Playgroud)

apn*_*ing 5

save! 保存对象并在失败时引发异常.


self[column]=,是一个轻微的元编程.

通常,当您知道列名称时,您会这样做:self.password_reset_token=.哪个与self[:password_reset_token]=或相同self["password_reset_token"]=.

所以很容易将列名称抽象为字符串/符号.

更清晰?