rails helper方法如何:attribute_changed?在Rails 3.2.15中有效吗?

时间:2014-05-24 15:40:51

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

这是我的情况 我需要:如果用户的电子邮件已更改,则生成用户确认码

我有     型号:

class User < ActiveRecord::Base
...
  after_update :generate_confirm_code if :email_changed?
...
  def generate_confirm_code
    self.confirmation_code = SecureRandom.urlsafe_base64.first(8)
    self.confirmed = false
  end

  def update_last_visit
    self.last_visit = Time.now.utc
    save
  end
...
end

还有一个方法:application_controller中的update_last_visit,它可以节省用户上次访问时间

class ApplicationController < ActionController::Base
...
  def update_last_visit
    current_user.update_last_visit if current_user
  end
...
end

这是问题的开始: 每次我重新加载页面我的确认码都会改变,即使我没有更改电子邮件。似乎更新last_visit也会更改confirmation_code,但为什么?

1 个答案:

答案 0 :(得分:3)

您的after_update宏上的语法略有错误。正如您现在所做的那样,if :email_changed?实际上只是在加载User类时是否运行after_update宏的修饰符。即它与puts "hi" if :some_condition?相同(此处if不是puts方法的输入。)

您想要的是将:if选项传递给after_update宏,如下所示:

after_update :generate_confirm_code, if: :email_changed?

请注意,if:现在已根植于after_update宏的选项哈希。

另请参阅Rails Guide on ActiveRecord Callbacks