Как написать модель рельсов для обработки зависимых полей? - PullRequest
0 голосов
/ 26 августа 2011

У меня есть форма с флажком, который включает / отключает другое поле:

<%= check_box_tag :enable %>
<%= text_input_tag :extra_parameter %>

Модель будет хранить дополнительный параметр, если enable - true. С _tag мне нужно будет передать дополнительные параметры из контроллера в модель.

Есть ли способ сделать это с помощью построителя форм и полностью реализовать логику в модели?

Вид:

<%= f.check_box :enable %>
<%= f.text_input :extra_parameter %>

Модель:

class ExampleModel < ActiveRecord::Base
  def enable=
     ????
  end

  def extra_parameter=
     self.extra_parameter = true if ???
  end
end

Один способ - это переменная экземпляра, но это предполагает, что модель 'enable' будет вызвана перед 'extra_parameter'. Это лучший способ? есть ли альтернатива?

Ответы [ 2 ]

2 голосов
/ 27 августа 2011

Вам нужно сделать это, переопределив метод initialize, чтобы иметь возможность сделать что-то подобное в вашем контроллере и заставить его просто работать:

ExampleModel.new(:extra_params => "Hello world", :enabled => true)

Ваша модель будет выглядеть примерно такниже, который переопределяет инициализацию, сначала вызывает super для установки любых доступных атрибутов, а затем устанавливает extra_params с помощью нашего пользовательского установщика.Мы должны сделать это в этом порядке, потому что, как вы упомянули, мы должны убедиться, что enabled установлено и возвращает правильное логическое значение, когда мы решаем, устанавливать или нет extra_params.

class ExampleModel < ActiveRecord::Base
  def initialize(attrs={})
    super(attrs)
    self.extra_params = attrs.fetch(:extra_params, nil)
  end

  def extra_params=(value)
    self[:extra_params] = value if enabled?
  end
end

При использовании этого метода порядок установки параметров при обновлении объекта не должен иметь значения.

0 голосов
/ 27 августа 2011

Для атрибутов, которые не имеют эквивалентного столбца в базах данных, вы можете использовать attr_accessor :

attr_accessor :enable

def extra_parameter=(value)
    self[:extra_parameter] = value if enable
end

Пока "enable" передается перед "extra_parameter" в массовом назначении, это будет работать. Я не уверен, что этот приказ может быть приведен в исполнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...