如何以嵌套形式使用select_tag助手?

时间:2010-07-10 21:18:24

标签: ruby-on-rails

更新:解决方案

我希望有人花了一些时间来解决这个问题...我正在rails应用程序中构建一个地址簿,我有一个Person模型和一个Email模型。 Person has_many电子邮件,Person接受_nested_attributes_for:电子邮件。

这一切都很完美 - 我有一个嵌套的表单,我可以在表单中添加和删除电子邮件及其属性(使用类似于Railscasts 196-7(here)的方法)。提交表单会创建具有所有正确关联的Person和电子邮件。

问题是,就目前而言,我无法找到在嵌套电子邮件模型上使用选择标记的方法,以便用户为该电子邮件选择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中使用相同的代码片段设置ID的一种hacky方式。 partials吐出一个硬编码的选择和选项,在这种情况下为'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助手,并替换我的hacky-hard-coded选择?如果没有,有任何关于编写我自己的帮助方法的建议吗?

提前致谢!

更新:感谢Geoff的解决方案。对于后代来说,最重要的是使用select而不是select_tag。然后你可以做这样的事情:

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

1 个答案:

答案 0 :(得分:2)

你应该只需要将formbuilder变量传递给partial。你可以这样编码你的部分:

<%= 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区块内一样。

希望这有帮助!