Как использовать помощник select_tag во вложенной форме? - PullRequest
1 голос
/ 11 июля 2010

ОБНОВЛЕНИЕ: РЕШЕНИЕ ВНИЗ

Я надеюсь, что кто-то еще потратил некоторое время на решение этой же проблемы ... Я создаю адресную книгу в приложении rails, и у меня есть модель Person и модель Email. Person has_many Emails, и Person accept_nested_attributes_for: emails.

Это все работает отлично - у меня есть вложенная форма, с помощью которой я могу добавлять и удалять электронные письма и их атрибуты в моей форме (используя метод, подобный Railscasts 196-7 ( здесь )). Отправка формы создает человека, а также электронные письма, со всеми правильными ассоциациями.

Проблема в том, что в настоящее время я не могу найти способ использовать тег выбора на модели вложенного электронного адреса, чтобы пользователь мог выбрать KIND (например, рабочий, домашний, другой) для этого электронного письма. Таким образом, редактируя модель Person в том виде, в каком она у меня сейчас, нет простого способа выбрать атрибут, хранящийся в модели rails.

Вот что у меня сейчас:

<%= form_for(@source) do |f| %> 
<% f.fields_for :emails do |builder| %>  
. . . 
<%= builder.text_field :address, :size => 15 %>



<%= render :partial => 'email_select_1' %>0<%= render :partial => 'email_select_2' %>0<%= render :partial => 'email_select_3' %>

Примечание: вышеописанный хакерский способ разрешить мне установить идентификатор позже в javascript, используя те же фрагменты кода. Частицы выделяют жестко запрограммированный выбор и параметры, в данном случае «0», но в JavaScript я могу изменить его на уникальный:

<select id="person_emails_attributes_0_kind" name="person[emails_attributes][0][kind]"><option value="work">work</option><option value="home">home</option><option value="other">other</option></select>

, а затем все остальное выглядит так (сокращенно):

. . .
<% end %>  
. . .
<!-- more form stuff, actions, etc... -->
. . . 
<% end %>

Есть ли способ использовать для этого хелпер select_tag и заменить мой хакерно-жестко запрограммированный выбор? Если нет, то есть предложения по написанию моего собственного вспомогательного метода?

Заранее спасибо!

ОБНОВЛЕНИЕ: Спасибо Джеффу за решение. Для потомков главное - использовать select, а не select_tag. Тогда вы можете просто сделать что-то вроде этого:

<%= builder.select :kind, [['work', 'work'], ['home', 'home'], ['other', 'other']]%>

1 Ответ

2 голосов
/ 11 июля 2010

вам просто нужно передать переменную formbuilder в парциальное. вы бы сделали это, кодируя вашу частичку следующим образом:

<%= form_for(@source) do |f| %> 
  <% f.fields_for :emails do |builder| %>  
  . . . 
  <%= builder.text_field :address, :size => 15 %>
    <%= render :partial => 'email_select_1', :locals => {:builder => builder} %>
  <% end %>
<% end %>

А потом свою частичку вы бы использовали:

<%= builder.select :kind %>

так же, как если бы это было в блоке fields_for.

Надеюсь, это поможет!

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