如何将一个表单中的项目添加到Rails中另一个表单的下拉选项中

时间:2015-03-09 16:47:20

标签: javascript jquery ruby-on-rails ajax

很抱歉,如果这是重复的,我无法在任何地方找到答案!

简而言之,我需要动态地将一个项目添加到表单的下拉菜单中,而不会丢失任何编辑。

更具体地说,我正在以铁轨形式添加配方。每种成分都有一个数量字段,一个包含所有现有成分的下拉菜单,然后是一个用于描述成分的字段。我的Rails表单成功添加了配方,设置了配方与recipe_ingredients表(列出recipe_id,ingredient_id,金额等的中间表)之间的关联,并成功提取了配料的名称来自ingredients表。一切都很好。因此,recipe.recipe_ingredients将列出食谱中的所有成分,recipe.ingredient.first.name将说“面食”或其他。一切都很好。

但是,如果ingredients表中的配料名称尚不存在,我无法找到将该配料添加到下拉列表中的最佳方法,而不会废弃整个配方并转到另一页将成分添加到ingredients表并返回到配方页面以再次添加配方。

我不确定这样做的最好方法。我想在侧边栏中添加一个新的成分添加到配料表中(配料有一个名称和类别 - 乳制品,农产品等)所以仅仅在原始形式中有一个空白字段是不够的新名字。但我有两个问题。我不确定在配方页面上添加到ingredients表单的内容,以使该表单与配料控制器而不是配方控制器交互。提交按钮中的某些内容告诉它使用哪个控制器?而且我不知道如何动态更新配方表单中的下拉菜单以使用新项目更新菜单。特别是没有重置前一次下降的状态 - 这可能只是说更新它的“最后”下降?

我很乐意提供任何代码来澄清,只是不想用不必要的细节压倒。

2 个答案:

答案 0 :(得分:0)

  

但我有两个问题。我不确定在配方页面上添加什么成分,以使该表格与配料控制器而不是食谱控制器互动。

这是通过form_helper:

完成的
<%= form_for :ingredient, :url => {:controller => "/recepies", :action => your-action-here %>

为了更新下拉字段,需要一些JS:

  1. 创建将从表单中调用的控制器操作
  2. 添加:remote =&gt;调用表单助手的真正选项:

     {},:remote =&gt; true%&gt;
  3. 然后创建一个视图:/recicpies/your-action-name.js.erb

    在此模板中,您可以使用Javascript更新下拉菜单,因为控制器将呈现.js.erb模板并将其发送回浏览器,因为&#39;:remote =&gt;真正的&#39;选项

    如果您提供一些代码详细信息,我相信我可以告诉您有关如何操作的详细信息

答案 1 :(得分:0)

好吧,拍。我想我只想出来了。

使用cocoon gem我在成分下拉后添加了link_to_add_association。因此,如果我的成分未包含在下拉列表中,我可以点击链接,这将在表单中添加必要的字段以添加新成分。

所以现在成分下拉看起来像这样:

<%= f.label :ingredient_id, 'Ingredient:' %>
  <div class="ing">
    <%= f.select(:ingredient_id, Ingredient.all.order('ingredients.name ASC').map{|i| [ i.name, i.id ] }, {include_blank: true})%>
  </div>

<%= link_to_add_association 'or add ingredient', f, :ingredient, 'data-association-insertion-node' => ".ing", 'data-association-insertion-method' => "append", :class => "add-ingredient" %>

链接会插入此部分:

<div class="nested-fields">
  <%= f.text_field :name %>
  <%= f.text_field :category %>

  <%= link_to_remove_association "del", f, :class => "remove-ingredient" %>
</div>

这将动态添加具有所有正确控制器的表单。它似乎工作!我已经两天苦苦挣扎了。我一问完这个问题我想出来的数字......