Rails Callback控制台正常,服务器环境下失效该如何解决?
问题解决方法
问题出在Web表单提交时,login字段会被传入空字符串("")而非nil,而你当前的ensure_login_has_a_value方法只判断了login.nil?,空字符串不满足这个条件,所以不会触发赋值逻辑。
修改方法很简单,把判断条件改成检查login是否为空(包含nil和空字符串的情况),用Rails内置的blank?方法即可:
class User < ApplicationRecord validates :login, :email, presence: true before_validation :ensure_login_has_a_value private def ensure_login_has_a_value if login.blank? self.login = email unless email.blank? end end end
也可以用更简洁的写法,利用||=运算符自动处理空值情况:
private def ensure_login_has_a_value self.login ||= email unless email.blank? end
这样不管是通过控制台传入nil,还是Web表单提交空字符串,都会自动将login设为邮箱值,同时避免邮箱为空时的无效赋值。
内容的提问来源于stack exchange,提问作者jack parsons
相关产品推荐
相关产品推荐

