更新:解决方案
我希望有人花了一些时间来解决这个问题...我正在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']]%>
答案 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
区块内一样。
希望这有帮助!