Ruby on rails 如何使用ledermann Rails设置和扩展在模型内部但在过滤器外部执行Rails模型验证检查 背景

Ruby on rails 如何使用ledermann Rails设置和扩展在模型内部但在过滤器外部执行Rails模型验证检查 背景,ruby-on-rails,validation,activerecord,settings,Ruby On Rails,Validation,Activerecord,Settings,我在rails 2/3项目中使用ledermann rails settings()来扩展具有某些属性的模型,这些属性不一定需要放在一个宽表中的DB中,并且可以很好地满足我们的需要 我选择这个Gem的另一个原因是因为有一篇文章将ledermannrails设置与模型联系得更紧密,以便为管理员GUI支持使用干净的表单。这是一个完美的解决方案,用于解决表单_的支持问题,尽管 不过,我现在遇到的是在传递给ledermann rails设置模块之前正确验证动态getter/setter。此时,它们会立即

我在rails 2/3项目中使用ledermann rails settings()来扩展具有某些属性的模型,这些属性不一定需要放在一个宽表中的DB中,并且可以很好地满足我们的需要

我选择这个Gem的另一个原因是因为有一篇文章将ledermannrails设置与模型联系得更紧密,以便为管理员GUI支持使用干净的表单。这是一个完美的解决方案,用于解决表单_的支持问题,尽管

不过,我现在遇到的是在传递给ledermann rails设置模块之前正确验证动态getter/setter。此时,它们会立即保存,不管模型验证是否已实际启动—我可以通过脚本/控制台看到正在引发验证错误

例子 例如,我想验证属性:foo是否在十进制用法(甚至是正则表达式)的0..100范围内。我发现在上一篇文章中,我可以使用标准的Rails验证器(惊喜,惊喜),但我想停止实际保存任何值,直到这些值被解决——确保GUI的用户给出了61.43作为一个数值

以下代码是从引用的文章中借用的

class User < ActiveRecord::Base

  has_settings

  validates_inclusion_of :foo, :in => 0..100

  def self.settings_attr_accessor(*args)

    >>SOME SORT OF UNLESS MODEL.VALID? CHECK HERE      

      args.each do |method_name|
        eval "
          def #{method_name}
            self.settings.send(:#{method_name})
          end
          def #{method_name}=(value)
            self.settings.send(:#{method_name}=, value)
          end
        "
      end

    >>END UNLESS

  end

  settings_attr_accessor :foo

end
class用户0..100的包含
定义自设置属性访问器(*args)
>>某种类型的,除非模型有效?检查这里
args.each do| method_name|
“评估”
def#{method_name}
self.settings.send(:#{method_name})
结束
def#{method_name}=(值)
self.settings.send(:#{method_name}=,value)
结束
"
结束
>>结束,除非
结束
设置\u属性\u访问器:foo
结束


在这里,除了将模型的状态放入一个before过滤器之外,还有人想过在这个时候提取模型的状态吗?这里的目标是能够使用标准验证,并避免为添加的每个新设置\u attr\u访问器滚动自定义验证检查。谢谢

这里有一个新版本,使用新的2x语法。是的,它很难看,而且有双重评估功能。
这将生成名称空间方法名称,并将它们添加到attr_可访问列表中。这些名称的形式是
“#{namespace}#{attribute}
,可以在表单中使用。我正在蒙骗gem的一个补丁来自动执行此操作,但我还没有

has_settings do |s|
  eval 'def self.settings_accessors(namespace, defaults)
        defaults.keys.each do |method_name|
        attr_accessible "#{namespace}_#{method_name}"
        eval "def #{namespace}_#{method_name}
                self.settings(:#{namespace.to_s}).send(:#{method_name})
              end
              def #{namespace}_#{method_name}=(value)
                self.settings(:#{namespace}).send(:#{method_name}=, value)
              end
            "
        end
      end'
  namespace = :fileshare
  defaults = {:media => false, :sit => false, :quota_size => 1}
  s.key namespace, :defaults => defaults
  self.settings_accessors(namespace, defaults)
end

这里有一个新的版本,它使用新的2x语法。是的,它很难看,并且执行双重求值。
这将生成名称空间方法名称并将它们添加到attr_可访问列表中。名称的形式为
“#{namespace}#{attribute}
,可以在表单中使用。我正在蒙骗一个ppatch到gem自动做这件事,但我还没有做到

has_settings do |s|
  eval 'def self.settings_accessors(namespace, defaults)
        defaults.keys.each do |method_name|
        attr_accessible "#{namespace}_#{method_name}"
        eval "def #{namespace}_#{method_name}
                self.settings(:#{namespace.to_s}).send(:#{method_name})
              end
              def #{namespace}_#{method_name}=(value)
                self.settings(:#{namespace}).send(:#{method_name}=, value)
              end
            "
        end
      end'
  namespace = :fileshare
  defaults = {:media => false, :sit => false, :quota_size => 1}
  s.key namespace, :defaults => defaults
  self.settings_accessors(namespace, defaults)
end