Ruby on Rails вложенные динамические поля - PullRequest
1 голос
/ 17 февраля 2010

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

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

Если пользователь нажимает переключатель «машина», форма расширяется текстовыми полями, например, например. «engine», «color», и если пользователь выбирает переключатель «ship», форма расширяется текстовыми полями, такими как «длина», «вес». Атрибуты engine, color, length, weight являются полями в БД на столе машины.

Моя проблема в том, что произойдет, если проверка вернет ошибки. Как я могу использовать частичные для решения моей проблемы. Я пробовал 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 возвращает ошибки проверки?

Другое решение состоит в том, чтобы использовать remote_function (которая вызывает, например, check_fields) и partials (CODE POSTED ABOVE)! Благодаря этим решениям я получаю NameErros на 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!

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

1 Ответ

0 голосов
/ 16 ноября 2010

Для начала.«f» - это название формы.В случае ваших частичных представлений первая форма - это общая форма для "komplex_object".

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

:locals => { :f => machine_f }

, частичноеимеет переменную с именем "f", к которой вы добавляете все поля.


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

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

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

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

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


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

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

Взгляните на "error_messages_for" вместо "f.error_messages"

...