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

时间:2012-10-07 18:51:14

标签: 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

我不明白为什么save!调用send_password_reset内部的原因?另外,我不熟悉generate_tokenself[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

2 个答案:

答案 0 :(得分:5)

save!保存对象,如果失败则引发异常。


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

通常,当您知道列名称时,您会执行:self.password_reset_token=。这与self[:password_reset_token]=self["password_reset_token"]=相同。

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

更清晰?

答案 1 :(得分: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]=用于设置用户列。