我在“记住我”和“重置密码”上观看了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_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
答案 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]=
用于设置用户列。