如何为Rails生成标准属性设置器

时间:2016-08-18 14:46:52

标签: ruby-on-rails

我的应用程序模型中有很多字符串,每个字符串不应包含任何前导,尾随和重复的空白。

为了确保这一点,我为每个属性创建了单独的属性setter方法:

def label=( text )
  write_attribute( :label, text.strip.squeeze(' '))
end

def description=( text )
  write_attribute( :description, text.strip.squeeze(' '))
end

...

应该有更优雅,干燥的方式。包括支票为零。

1 个答案:

答案 0 :(得分:1)

在您的关注点中定义一个类方法,创建所有需要的属性设置器。对于所有空白值,此版本将返回nil,对于其他值,此版本将返回修剪和压缩的字符串:

module ApplicationModel
  extend ActiveSupport::Concern

  module ClassMethods

    def set_trimmed( *attributes )
      attributes.each do |a|
        define_method "#{ a.to_s }=" do |t|
          tt = t.blank? ? nil : t.strip.squeeze(' ')
          write_attribute( a, tt )
        end
      end
    end

  end
end

并简单列出模型中要为其定义此属性设置器的属性(不要忘记包含上面的模块):

include ApplicationModel

set_trimmed :label, :description, :postal_address, :street_address, ...