Вложенные динамические поля Ruby on Rails

У меня проблема найти правильный способ программирования динамических полей. Например: у меня есть два переключателя, и в зависимости от того, как пользователь выбирает один переключатель, он расширяет форму различными полями.

Начальная форма: - Радиокнопка: автомобиль - Радиокнопка: корабль - Текстовое поле: имя

Если пользователь щелкает переключатель «автомобиль», форма расширяется текстовыми полями, например, например. «двигатель», «цвет», и если пользователь выбирает переключатель «корабль», форма расширяется текстовыми полями, такими как «длина», «вес». Атрибуты двигатель, цвет, длина, вес являются полями в БД на настольной машине.

Моя проблема в том, что произойдет, если проверка вернет ошибки. Как я могу использовать частичные, чтобы решить мою проблему. Я пробовал remote_function (для замены частей html), partials и rjs, но rails возвращает мне NameErrors!

Моя форма выглядит так:

<% form_for(@komplex_object, :url => some_url) do |f| %>
    <%= f.error_messages %> 
    <% f.fields_for :machine do |machine_f| %>
        <%= machine_f.radio_button :kind, 'car', :onclick => some_request_or_javascript, :checked => true -%> Car
        <%= machine_f.radio_button :kind, 'ship', :onclick => some_request_or_javascript -%> Ship       
        <div id="dynamic_fields">
            <% render :partial => 'car', :locals => { :f => machine_f } %>
        </div>
    <% end %>

    <p><%= f.label :name %>
    <%= f.text_field :name %></p>
    ...
<% end %>

Внимание: атрибуты машины вложены в форму komplex_object!

А вот части:

# _car.html.erb
<p><%= f.label :engine %>
<%= f.text_field :engine %></p>
<p><%= f.label :color %>
<%= f.text_field :color %></p>

# _ship.html.erb
<p><%= f.label :length %>
<%= f.text_field :length %></p>
<p><%= f.label :weight %>
<%= f.text_field :weight %></p>

В форме я написал «some_request_or_javascript», и здесь я тестирую различные решения, такие как javascript, который скрывает и показывает два разных div, содержащих поля автомобиля или корабля. Это решение запускается, но при отправке отправляются все хеш-поля, а не только те поля, которые пользователь выбрал с помощью переключателя. Вторая проблема: как распознать правильные поля, если submit возвращает ошибки проверки?

Другим решением является использование удаленной_функции (которая вызывает, например, check_fields) и партиалов (КОД, ОПИСАННЫЙ ВЫШЕ)! С помощью этих решений я получаю NameEros на rjs, потому что функция page.replace_html

# controller function that remote function calls
# Ajax update for the right fields
def check_fields
  respond_to do |format|
          format.js { render :action => params[:kind] }
  end
end 

# ship.js.rjs
page.replace 'dynamic_fields', :partial => 'ship'

не понимаю букву "f" в частичном _ship.html.erb!

Есть идеи? спасибо заранее


person phlegx    schedule 17.02.2010    source источник


Ответы (1)


Начать с. 'f' - это имя формы. В случае с вашими частями первая форма - это общая форма для "complex_object".

Затем у вас есть подформа, которая является вашей формой «machine_f». Затем в партиале вы передаете эту вторичную форму в партиал как новую локальную переменную, которая также называется «f» (в суб-партиале), используя:

:locals => { :f => machine_f }

В частичном просто есть переменная с именем «f», к которой вы добавляете все поля.


Во-вторых. Все ваши проблемы с открытием/закрытием формы должны быть решаемы только с помощью javascript.

Лучший способ решить эту проблему — начать со всех форм, присутствующих и видимых на странице (т. е. как того, что должно отображаться, если пользователь нажимает «автомобиль» , так и того, что должно отображаться, если пользователь нажимает « корабль".

Затем используйте функцию javascript, чтобы скрыть тот, который в данный момент не актуален. например, он будет смотреть на переключатели - если нажата кнопка «радио-корабль», то js скрывает «частичный автомобиль» и наоборот.

Это также имеет дополнительное преимущество: если у кого-то нет имеет javascript (или он ломается), то, по крайней мере, он будет бесполезным, а не бесполезным.

Дайте мне знать, достаточно ли этого для вас, но это общая основа вашего решения.


В-третьих, причина, по которой у вас возникают проблемы с ошибками, заключается в том, что вы отображаете их все одним большим фрагментом в верхней части страницы, получая все ошибки для «komplex_object», а также связанные объекты в одном большом двоичном объекте.

Фактически вы можете помещать сообщения об ошибках для конкретной подмодели (например, автомобиля или корабля) в подформу.

Посмотрите на "error_messages_for" вместо "f.error_messages"

person Taryn East    schedule 16.11.2010