在Rails 3中保存之前,操作表单数据的最佳实践是什么?

时间:2011-03-17 19:23:12

标签: ruby-on-rails design-patterns

从rails最佳实践的角度来看,在保存之前操作表单数据的最佳位置是什么?

对于instace,在联系表单上,我想确保所有数据都以大写形式保存(当你们在“请联系我”表单提交时,你们不讨厌人们吗?:-))< / p>

  • 在控制器中进行操作会更好吗?我可以在创建中执行此操作,或将其移动到某种私有方法中,这将在保存/更新之前将对象的所有字符串属性大写?

  • 在模型before_save中做得更好吗? 我觉得它应该在模型中完成,因为我可能希望所有记录都相同,无论我是在rake任务中还是通过Web界面操作它们。

加分:

如果我想在所有模型上使用它,并且能够根据具体情况覆盖默认值,我还会放在哪里?应用控制器? 可能存在一些特殊情况,您希望在没有大写的情况下节省价值 - 即不大写的品牌产品(即utorrent)或名称中应该有多个上限的姓氏(即爱尔兰和苏格兰名称如麦当劳)

谢谢!

3 个答案:

答案 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在哪里的人!

感谢大家的投入(全部投票)。