【问题标题】:Rails 3 strip whitespace before_validation on all formsRails 3 在所有表单上去掉空格 before_validation
【发布时间】:2010-11-28 01:56:17
【问题描述】:

我对 Rails 比较陌生,有点惊讶这不是一种可配置的行为……至少我还没找到?!?我原以为 99% 的表单会受益于从所有 stringtext 字段中修剪空白?!?我猜我错了……

无论如何,我正在寻找一种 DRY 方法来从 Rails 3 应用程序中的表单字段(类型为 :string 和 :text)中去除所有空格。

视图具有自动引用(包括?)并且可用于每个视图的帮助器......但是模型似乎没有这样的东西?!?还是他们?

所以目前我正在执行以下操作,其中 首先 需要 并且 然后 包括 whitespace_helper(又名 WhitespaceHelper)。但这对我来说似乎仍然不是很干燥,但它确实有效......

类名.rb:

require 'whitespace_helper'

class ClassName < ActiveRecord::Base
  include WhitespaceHelper
  before_validation :strip_blanks

  ...

  protected

   def strip_blanks
     self.attributeA.strip!
     self.attributeB.strip!
     ...
   end

lib/whitespace_helper.rb:

module WhitespaceHelper
  def strip_whitespace
    self.attributes.each_pair do |key, value| 
    self[key] = value.strip if value.respond_to?('strip')
  end
end

我想我正在寻找一个单一的(D.R.Y.)方法(类?)放在某个地方(lib/?),它将获取参数(或属性)列表并删除空格(.strip!?)从每个属性没有被具体命名。

【问题讨论】:

  • 你可以把它放在一个 helper 中并包含在你的模型中
  • 谢谢,但这似乎只有在我先 require whitespace_helper 然后 include WhitespaceHelper 在同一个文件中时才有效。这干得怎么样?似乎多余...有人可以解释一下吗?
  • 'include' 用于将模块包含到类中。您可以在同一个文件中拥有一个模块和一个类。如果您希望该类包含该模块,您仍然必须使用“包含”语句。 'require' 语句加载一个 ruby​​ 文件。加载文件不会将其包含在类中,这就是您需要包含的原因。
  • 谢谢!所以,我想这归结为我的问题的本质......如果我想在我所有使用表单输入的模型中访问那个简单的 2(4?,6?)行助手WhitespaceHelper,那么我需要添加requireinclude 到每个 model.rb 文件?对我来说似乎不是很红宝石风格或干燥?!?我觉得我一定错过了什么?视图(甚至控制器)怎么能对 helper 如此友好,而模型却不是?

标签: ruby-on-rails validation whitespace dry helpers


【解决方案1】:

创建一个before_validation 助手,如here 所示

module Trimmer
  def trimmed_fields *field_list  
    before_validation do |model|
      field_list.each do |n|
        model[n] = model[n].strip if model[n].respond_to?('strip')
      end
    end
  end
end

require 'trimmer'
class ClassName < ActiveRecord::Base
  extend Trimmer
  trimmed_fields :attributeA, :attributeB
end

【讨论】:

  • 为什么不在类中定义 Trimmer 和 extend Trimmer 上的方法?
  • @Semyon 只是约定,也可以。这样你就可以在同一个模块中包含实例和类助手。我已将示例更新为使用 ActiveSupport::Concern,它更易于阅读。
  • 嗯,ActiveSupport::Concern 很酷,但在这种情况下扩展更简单。
【解决方案2】:

使用AutoStripAttributes gem for Rails。它将帮助您轻松干净地完成任务。

class User < ActiveRecord::Base
 # Normal usage where " aaa   bbb\t " changes to "aaa bbb"
  auto_strip_attributes :nick, :comment

  # Squeezes spaces inside the string: "James   Bond  " => "James Bond"
  auto_strip_attributes :name, :squish => true

  # Won't set to null even if string is blank. "   " => ""
  auto_strip_attributes :email, :nullify => false
end

【讨论】:

    【解决方案3】:

    注意我没有尝试过,这可能是一个疯狂的想法,但你可以创建一个这样的类:

    MyActiveRecordBase < ActiveRecord::Base
      require 'whitespace_helper'  
      include WhitespaceHelper
    end
    

    ...然后让你的模型继承自它而不是 AR::Base:

    MyModel < MyActiveRecordBase
      # stuff
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-17
      • 2019-08-19
      • 2023-03-14
      • 1970-01-01
      • 2021-05-14
      • 2020-08-27
      • 1970-01-01
      • 2018-09-13
      相关资源
      最近更新 更多