Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在保存到Rails 3之前,操作表单数据的最佳实践是什么?_Ruby On Rails_Design Patterns - Fatal编程技术网

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

Ruby on rails 在保存到Rails 3之前,操作表单数据的最佳实践是什么?,ruby-on-rails,design-patterns,Ruby On Rails,Design Patterns,从rails最佳实践的角度来看,在保存表单数据之前,操作表单数据的最佳位置是什么 对于Instance,在联系人表单上,我希望确保所有数据都以大写形式保存(当人们在提交“请与我联系”表单时对你大喊大叫,你不讨厌吗?:-) 在控制器中进行操作更好吗?我可以在create中完成它,或者将它移动到某种私有方法中,在保存/更新之前将对象的所有字符串属性大写 或 保存前最好先在模型中执行吗? 这对我来说是有意义的,应该在模型中完成,因为我可能希望所有记录都是相同的,无论我是在rake任务中还是通过w

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

对于Instance,在联系人表单上,我希望确保所有数据都以大写形式保存(当人们在提交“请与我联系”表单时对你大喊大叫,你不讨厌吗?:-)

  • 在控制器中进行操作更好吗?我可以在create中完成它,或者将它移动到某种私有方法中,在保存/更新之前将对象的所有字符串属性大写

  • 保存前最好先在模型中执行吗? 这对我来说是有意义的,应该在模型中完成,因为我可能希望所有记录都是相同的,无论我是在rake任务中还是通过web界面对它们进行操作
奖金:

另外,如果我想在我所有的模型上都这样做,并且能够根据具体情况覆盖默认值,我会把它放在哪里?应用控制器? 在某些特殊情况下,您可能希望在不使用大写字母的情况下节约价值,例如,不使用大写字母的品牌名称产品(即utorrent)或名称中应包含多个大写字母的姓氏(例如,像麦当劳这样的爱尔兰和苏格兰名称)


谢谢大家!

最好把它放在你的模型里,这样你就有了一个胖的模型和一个瘦的控制器,这是一件“好事”


如果你想让它适用于你所有的模型,我的建议是使用一个包含你共享功能的模块,然后将它包含在你想要默认行为的所有模型中。

最简单的地方是在你的模型中。如果您觉得更合适,我建议您在保存之前或甚至在验证之前使用。像这样的东西可以达到目的:

before_save :upcase_content

def upcase_content
  self.content = self.content.upcase
end
此外,如果您希望允许基于具体情况的异常,您可以向模型中添加attr_访问器

class MyModel < ActiveRecord::Base
attr_accessor :dont_upcase

before_save :upcase_content, :unless => :dont_upcase
...
end

根据其他回复的建议,我提出了以下解决方案:

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
环境中.rb添加

require "clean_strings"
现在每当我这样做

@a.dont_capitalize = true
@a.save!
它根据我的规则在保存之前清理它(它将删除空白,但不会大写)。显然,它需要更多的微调,但我认为这是一种为普通事物定义格式规则的好方法。这样我就不需要对每一个表单输入进行清理,比如额外的空格,或者不知道大写锁在哪里的人


谢谢大家的意见(全部投了赞成票)。

这是一个关于访问者的有趣想法,我需要进一步检查。是的,这是我从一个网站上了解到的,现在有点过时了,但背后的理论仍然是相同的,我不必在每个模型中都包含它,我宁愿在我不需要的模型中覆盖它(我有70多个模型,它们都应该以这种方式格式化某些字段,只有少数不应该有这种行为)我想我只需要在lib中扩展活动记录。但是感谢指针。另一种选择是使用从任何地方继承的基类。我建议不要在初始值设定项中进行修补。请参阅我自己的答案-这就是我最终要做的。
@a.dont_capitalize = true
@a.save!