Ruby on rails 如何在嵌套表单中使用select_标记辅助对象?

Ruby on rails 如何在嵌套表单中使用select_标记辅助对象?,ruby-on-rails,Ruby On Rails,更新:底部的解决方案 我希望其他人花了一些时间来解决这个问题。。。我正在rails应用程序中构建一个地址簿,我有一个个人模型和一个电子邮件模型。此人有许多电子邮件,并且此人接受电子邮件的嵌套属性 这一切都很完美——我有一个嵌套表单,可以使用它在表单中添加和删除电子邮件及其属性(使用类似于Railscasts 196-7()的方法)。提交表单将创建具有所有正确关联的人员以及电子邮件 问题是,目前为止,我无法找到一种方法,在嵌套的电子邮件模型上使用select标记,让用户为该电子邮件选择一种类型(例

更新:底部的解决方案

我希望其他人花了一些时间来解决这个问题。。。我正在rails应用程序中构建一个地址簿,我有一个个人模型和一个电子邮件模型。此人有许多电子邮件,并且此人接受电子邮件的嵌套属性

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

问题是,目前为止,我无法找到一种方法,在嵌套的电子邮件模型上使用select标记,让用户为该电子邮件选择一种类型(例如,工作、家庭、其他)。因此,按照我现在的方式编辑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' %>

. . . 
15 %>
'email\u select\u 1'>0'email\u select\u 2'>0'email\u select\u 3'>
注意:以上是一种黑客方式,允许我稍后在javascript中使用相同的代码片段设置ID。partials给出了一个硬编码的select和options,在本例中为“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>
workhomether
然后剩下的看起来像这样(abbrev):

。
. . .
. . . 
有没有一种方法可以使用select_标记帮助程序来实现这一点,并替换我的hacky硬编码select?如果没有,对编写我自己的助手方法有什么建议

提前谢谢

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

<%= builder.select :kind, [['work', 'work'], ['home', 'home'], ['other', 'other']]%>
<%= 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 %>

您应该只需要将formbuilder变量传递给partial。您可以通过如下方式编码您的分部代码:

<%= builder.select :kind, [['work', 'work'], ['home', 'home'], ['other', 'other']]%>
<%= 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 %>

. . . 
15 %>
'email_select_1',:locals=>{:builder=>builder}%>
然后你会使用你的部分:

<%= builder.select :kind %>

就像它在块的
字段中一样


希望这有帮助

在测试中,我遇到了这样一个错误:未定义的方法“select_tag”表示“有什么想法吗?它是builder.select抱歉。。。修正了我的帖子。