确保模型属性始终被降级和剥离的最佳方法是什么?

时间:2016-05-01 20:10:52

标签: ruby-on-rails ruby validation

我想知道在所有情况下确保用户提供的参数的最佳方式是低级和剥离的。

我想实现以下目标:

  1. 保证除非剥离/缩小
  2. ,否则不会将属性保存到数据库
  3. 对db的查询应始终为down / strip属性
  4. 针对用户提供的params
  5. 的下层/剥离版本运行验证
  6. 模型返回downcase / stripped属性(给定项目#1不应​​该是一个问题)

4 个答案:

答案 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