Change or update an attribute value during Rails ActiveRecord validation

扶醉桌前 提交于 2020-08-27 05:58:05

问题


Summary: I'm trying to alter an attribute's value within a custom ActiveModel::EachValidator validator. Given the following prototype:

def validate_each(record, attribute, value)

trying to set value = thing doesn't appear to do anything -- am I missing something? There should be a smart way to do this...

Detail: I accept a URL input as part of a site. I don't want to just take the URL and directly validate that it returns a 200 OK message, because that would ignore entries that didn't start with http, or left out the leading www, etc. I have some custom logic to deal with those errors and follow redirects. Thus, I'd like the validation to succeed if a user types in example.org/article rather than http://www.example.org/article. The logic works properly inside the validation, but the problem is that if somebody types in the former, the stored value in the database is in the "wrong" form rather than the nicely updated one. Can I change the entry during validation to a more canonical form?


回答1:


You should leave the validation to do just that: validate; it's not the right place to manipulate your model's attributes.

See ActiveModel's before_validation callback. This is a more appropriate place to be manipulating model attributes in preparation for validation.

It looks like you have to tell your ActiveModel implementation about callbacks, at least according to this SO question.

class YourModel
  extend ActiveModel::Callbacks
  include ActiveModel::Validations
  include ActiveModel::Validations::Callbacks

  before_validation :manipulate_attributes

  def manipulate_attributes
    # Your manipulation here.
  end
end


来源:https://stackoverflow.com/questions/11727201/change-or-update-an-attribute-value-during-rails-activerecord-validation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!