Пользовательский конструктор форм не вызывается в методе fields_for - PullRequest
1 голос
/ 02 февраля 2012

У меня есть вложенная форма с 3 родственными моделями. Я хочу, чтобы все поля были построены моим настраиваемым конструктором форм PanelFormBuilder. Однако мой конструктор форм обрабатывает только form_for, а fields_for - по умолчанию. Я не могу на всю жизнь понять, почему.

Это работает:

<%= panel_form_for @firm do |f| %>

Это не:

<%= panel_fields_for @firm.company do |c| %>

Вот пользовательские методы:

module ApplicationHelper
  def panel_form_for(object, options = {}, &block)
    options[:builder] = PanelFormBuilder
    form_for(object, options, &block)
  end

  def panel_fields_for(object, options = {}, &block)
    options[:builder] = PanelFormBuilder
    fields_for(object, options, &block)
  end
end

Вот пользовательский конструктор форм

class PanelFormBuilder < ActionView::Helpers::FormBuilder
  delegate :content_tag, :tag, to: :@template

  %w[text_field text_area password_field].each do |method_name|
    define_method(method_name) do |name, *args|
      options = args.extract_options!
      options.merge!(:class => "required")
      super(name, *(args + [options]))
    end
  end
end

Может кто-нибудь сказать мне, что я делаю не так?

Спасибо

Ответы [ 2 ]

1 голос
/ 09 ноября 2015

Посмотрите на определение fields_for:

fields_for(record_name, record_object = nil, options = {}, &block)

Когда вы вызываете fields_for с блоком в качестве аргумента, Ruby не сможет выяснить, что указанный вами параметр optionsна самом деле это параметры, но вместо этого думайте, что это параметр record_object.

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

fields_for(object, nil, options, &block)

Это может быть полезно знать в ситуациях, когда у вас нет доступа к объекту построителя формы, например, когда вы создаете некоторые поля из отдельного блока yield.

1 голос
/ 16 февраля 2012

Нашел свой ответ.Оказывается, я должен был сделать это:

<%= panel_form_for @firm do |f| %>

Затем:

<%= f.fields_for :company do |c| %>

Мне вообще не нужен panel_fields_for.

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