ruby-on-rails - Rails 辅助方法 :attribute_changed? 在 Rails 3.2.15 中如何工作?

标签 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 但为什么呢?

最佳答案

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

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

after_update :generate_confirm_code, if: :email_changed?

请注意,if: 现在 Root 于 after_update 宏的选项散列中。

另请参阅 Rails Guide on ActiveRecord Callbacks .

关于ruby-on-rails - Rails 辅助方法 :attribute_changed? 在 Rails 3.2.15 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23846850/

相关文章:

ruby-on-rails - 这是什么意思? *** "Delete"参数 ":destroy,"需要是一个数字 (Rails)

ruby-on-rails - Rails 2.3 和 Rails 3.2 'weeks' 方法的区别

ruby - 为什么 ruby​​-debug 不允许我在规范中查看局部变量?

css - 如何从数据库中获取属性值并应用于表单

mysql - 尝试在 Windows 中使用 mysql 5.7.1 和 Rails 5 配置数据库时出现“未找到事件记录”错误

ruby-on-rails - Twilio 检查电话号码是否已被列入黑名单

ruby-on-rails - 在测试中创建的模型对象会怎样?

ruby-on-rails - 省略,跳过 redis 缓存存储,如果它不可用

ruby-on-rails - rails : Export data in google spreadsheet

ruby - 从文件读入数组并在 ruby​​ 中找到 ":"时停止