Как выполнить проверку правильности модели Rails внутри модели, но вне фильтров, используя настройки и расширения ledermann-rails - PullRequest
1 голос
/ 18 марта 2012

Фон

Я использую настройки ledermann-rails-settings (https://github.com/ledermann/rails-settings) в проекте Rails 2/3) для виртуального расширения модели с определенными атрибутами, которые не обязательно помещать в БД в широкой таблице. и это работает плавно для наших нужд.

Еще одна причина, по которой я выбрал этот Gem, заключается в посте Как создать форму для плагина rails-settings , который более тесно связывает настройки ledermann-rails-settings с моделью с целью очистки form_for использование для поддержки графического интерфейса администратора. Это идеальное решение для обращения в службу поддержки form_for, хотя ...

Сейчас я сталкиваюсь с тем, что правильно проверяет динамические методы получения / установки перед передачей в модуль ledermann-rails-settings. В настоящий момент они сохраняются немедленно, независимо от того, была ли запущена проверка модели - я вижу через скрипт / консоль, что возникают ошибки проверки.

Пример

Например, я хотел бы проверить, что атрибут: 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


У кого-нибудь есть какие-либо мысли о том, чтобы вывести состояние модели на этом этапе, за исключением необходимости помещать это в фильтр до? Цель в том, чтобы иметь возможность использовать стандартные проверки и избегать проверки пользовательских проверок для каждого добавляемого нового settings_attr_accessor. Спасибо!

1 Ответ

1 голос
/ 26 апреля 2013

Вот более новая версия, которая работает с новым синтаксисом 2x. Да, это уродливо и делает двойную оценку.
Это создает имена методов пространств имен и добавляет их в список attr_accessible. Имена имеют форму "#{namespace}_#{attribute} и могут использоваться в формах. Я пытаюсь сделать это автоматически, но я еще не там.

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
...