从rails最佳实践的角度来看,在保存之前操作表单数据的最佳位置是什么?
对于instace,在联系表单上,我想确保所有数据都以大写形式保存(当你们在“请联系我”表单提交时,你们不讨厌人们吗?:-))< / p>
或
加分:
如果我想在所有模型上使用它,并且能够根据具体情况覆盖默认值,我还会放在哪里?应用控制器? 可能存在一些特殊情况,您希望在没有大写的情况下节省价值 - 即不大写的品牌产品(即utorrent)或名称中应该有多个上限的姓氏(即爱尔兰和苏格兰名称如麦当劳)
谢谢!
答案 0 :(得分:4)
最简单的地方就是你的模型。如果您认为更合适,我建议使用before_save或甚至before_validation。像这样的东西可以解决这个问题:
before_save :upcase_content
def upcase_content
self.content = self.content.upcase
end
此外,如果您希望允许例外情况,您可以在模型中添加attr_accessor。
class MyModel < ActiveRecord::Base
attr_accessor :dont_upcase
before_save :upcase_content, :unless => :dont_upcase
...
end
然后在创建模型时将访问者设置为true
@model = Model.new(:brand_name => utorrent)
@model.dont_upcase = true
@model.save!
答案 1 :(得分:3)
把它放在你的模型中的最佳位置是,你有一个胖模型和一个瘦的控制器,这是一件“好事”。
如果您想让所有型号都可以使用它,我的建议是使用包含您的共享功能的模块,然后将其包含在您想要具有默认行为的所有模型中。
答案 2 :(得分:0)
根据其他回复的建议,我提出了这个解决方案:
<强> LIB / clean_strings.rb 强>
module ActiveRecord
class Base
attr_accessor :dont_capitlize, :dont_strip
before_save :_capitalize_strings, :unless => :dont_capitlize
before_save :_strip_whitespaces, :unless => :dont_strip
def _capitalize_strings
self.attributes.each_pair do |key, value|
self[key] = value.capitalize if value.respond_to?('capitalize')
end
end
def _strip_whitespaces
self.attributes.each_pair do |key, value|
self[key] = value.strip if value.respond_to?('strip')
end
end
end
end
environment.rb addded
require "clean_strings"
现在每当我做
@a.dont_capitalize = true
@a.save!
它根据我的规则在保存之前清除它(它会剥离空白,但不会大写它)。显然它需要更多的微调,但我认为这是定义普通事物的格式规则的好方法。这样我就不需要清理每个表单输入,例如额外的空格,或者不知道CAPS LOCK在哪里的人!
感谢大家的投入(全部投票)。