我想知道在所有情况下确保用户提供的参数的最佳方式是低级和剥离的。
我想实现以下目标:
答案 0 :(得分:0)
您需要编写一个before_save
回调方法,在该方法中,您可以对该用户设置的属性进行包装和删除。
例如:
class User < ActiveRecord::Base
before_save :format_values
def format_values
self.name = self.name.downcase
end
end
修改强>
我错过了关于验证的第3点。因此,如果您还需要对这些值运行验证。您需要改为使用before_validation
回调。
答案 1 :(得分:0)
您可以在before_validation
回调中执行此操作:
# in your model
before_validation :normalize_attribute
private
def normalize_attribute
# change `attribute` to your actual attribute's name
self.attribute = attribute.strip.downcase if attribute
end
或者您可以使用自定义设置器执行此操作:
# change `attribute` to your actual attribute's name
def attribute=(value)
write_attribute(:attribute, value.strip.downcase) if value
end
第一个选项将在每次保存对象时清理属性的值,即使该值未更改。如果在数据库中的记录已存在时引入此清理方法,这可能会有所帮助,因为这样可以在Rails控制台中仅使用一行代码清理所有现有记录:Model.find_each(&:save)
。第二个选项仅在设置值时清理值。这有点高效。
我建议您检查if attribute
这两种情况,否则您可能会在strip.downcase
上调用nil
值,这会导致异常。
答案 2 :(得分:0)
rm mainapp/migrations/0004_auto_20160427_0036.py*
答案 3 :(得分:0)
根据评论更新了答案。
无需对回调感兴趣(无论如何都不要使用回调)。只需覆盖属性的setter即可。
class MyModel
def some_attribute=(value)
value = value.strip.downcase if value
write_attribute(:some_attribute, value)
end
end