Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在表单中为一个站点添加4种饮料_Ruby On Rails_Ruby_Forms_Models_Formtastic - Fatal编程技术网

Ruby on rails 在表单中为一个站点添加4种饮料

Ruby on rails 在表单中为一个站点添加4种饮料,ruby-on-rails,ruby,forms,models,formtastic,Ruby On Rails,Ruby,Forms,Models,Formtastic,我有两种型号:车站和饮料 车站有很多:饮料和饮料属于:车站 我正在尝试制作我的表单,这样当你创建一个站点时,你可以选择4种同样属于该站点的饮料 原件: <%= semantic_form_for [:admin, @station] do |f| %> <fieldset class="inputs"> <ol> <%=f.input :name %> <%=f.input :number, :as =

我有两种型号:车站和饮料

车站有很多:饮料和饮料属于:车站

我正在尝试制作我的表单,这样当你创建一个站点时,你可以选择4种同样属于该站点的饮料

原件:

<%= semantic_form_for [:admin, @station] do |f| %>
<fieldset class="inputs">
    <ol>
        <%=f.input :name %>
        <%=f.input :number, :as => :number %>
    </ol>
</fieldset>
<%= f.buttons :commit %>
车站有很多:饮料

id | name |

更新 正如tihm在下文中所述,您可以添加4种饮料,并使用以下命令编辑其值:

<% f.fields_for :drinks do |drink_form| %>
            <%# Put your inputs here...could be a select box %>
            <%= drink_form.select :name, [['Drink #1', 'drink_1'],['Drink #2', drink_2] %>  

            <%# Or a plain input %>
            <%= drink_form.input :description %>  

            <%# ... Any other drink attributes ... %>
        <% end %>
但是,我要做的是生成四个选择框,每个选择框列出Drink.all,并能够用不同的对象替换一个Drink对象。因此,当您将第一个选择框的值从可口可乐更改为百事可乐时,它将从可口可乐中删除station_id,并将station_id添加到百事可乐


我不需要编辑饮料属性。。我只需要更改与本站相关的饮料。这是否可能以相同的形式出现?

您首先要看:

如果你知道你总是会有4个或更少,那么就容易一点,你可以跳过Railscasts的js

在控制器中,确保生成所需的空饮料对象:

....
@station = Station.new
4.times do
  @station.drinks.build
end
...
这样,视图中的字段_就有了要迭代的对象。在你看来,类似这样的事情:

<%= semantic_form_for [:admin, @station] do |f| %>
<fieldset class="inputs">
    <ol>
        <%=f.input :name %>
        <%=f.input :number, :as => :number %>
        <% f.fields_for :drinks do |drink_form| %>
            <%# Put your inputs here...could be a select box %>
            <%= drink_form.select :name, [['Drink #1', 'drink_1'],['Drink #2', drink_2] %>  

            <%# Or a plain input %>
            <%= drink_form.input :description %>  

            <%# ... Any other drink attributes ... %>
        <% end %>
    </ol>
</fieldset>
<%= f.buttons :commit %>

选择将在很大程度上取决于您从中选择的内容以及该数据的结构。它是否来自一个模型、一个简单的列表等。

不幸的是,我找不到rails的最佳实践方法。。。因此,我最终完成了一系列AJAX/自定义ruby代码来实现它。在这里,它可能会帮助其他人:

<% @drinks = Drink.all %>
    <fieldset class="inputs">
        <ol>
        <% @station.drinks.each_with_index do |d,i| %>
            <li>
                <label class="label" for="station_name">Item</label>
                <%=select("drink", "id", @drinks.collect { |d| [d.name,d.id] }, {:include_blank => true, :selected => d.id}, {:class => "station-items"})%>
            </li>
        <% end %>
        <% m = 4-@station.drinks.count %>
        <% m.times do %>
            <li>
                <label class=" label" for="station_name">Item</label>
                <%=select("drink", "id", @drinks.collect { |d| [d.name,d.id] }, {:include_blank => true}, {:class => "station-items"})%>
            </li>
        <% end %>
        </ol>
    </fieldset>
    <%= f.buttons :commit %>
<% end %>

<script>    
$(".station-items").on("change",function(){
  var node = $(this)
  , prev = node.attr('data-rel')
  , next = parseInt(node.val())
  , station_id = $("#station_id").val()

  if(next) {
    $.ajax({
      url: "/drinks/"+next+".json",
      type: "PUT",
      data: { id:next, "drink[station_id]":station_id }
    });
  }

  if(prev) {
    $.ajax({
      url: "/drinks/"+prev+".json",
      type: "PUT",
      data: { id:prev, "drink[station_id]":"" }
    });
  }

  $(this).attr('data-rel',next);
});

$('.station-items option:selected').each(function(){
  return $(this).parent().attr('data-rel',$(this).val())
});
</script>

这对于一个普通的Rails应用程序来说效果很好。另外,如果有人正在寻找一个解决方案来使用Active Admin,我也需要:已经解决了这个问题。好的,最初我认为这就是我需要的。然而,这比这要复杂一些。您在上面指定的内容允许我编辑与电台相关的4种饮料的内容名称、描述等。但是,我需要能够在第1点交换实际的饮料。因此,例如,我需要将饮料从百事可乐对象更改为可口可乐对象,而不是将饮料1的名称从百事可乐编辑为可口可乐。
<% @drinks = Drink.all %>
    <fieldset class="inputs">
        <ol>
        <% @station.drinks.each_with_index do |d,i| %>
            <li>
                <label class="label" for="station_name">Item</label>
                <%=select("drink", "id", @drinks.collect { |d| [d.name,d.id] }, {:include_blank => true, :selected => d.id}, {:class => "station-items"})%>
            </li>
        <% end %>
        <% m = 4-@station.drinks.count %>
        <% m.times do %>
            <li>
                <label class=" label" for="station_name">Item</label>
                <%=select("drink", "id", @drinks.collect { |d| [d.name,d.id] }, {:include_blank => true}, {:class => "station-items"})%>
            </li>
        <% end %>
        </ol>
    </fieldset>
    <%= f.buttons :commit %>
<% end %>

<script>    
$(".station-items").on("change",function(){
  var node = $(this)
  , prev = node.attr('data-rel')
  , next = parseInt(node.val())
  , station_id = $("#station_id").val()

  if(next) {
    $.ajax({
      url: "/drinks/"+next+".json",
      type: "PUT",
      data: { id:next, "drink[station_id]":station_id }
    });
  }

  if(prev) {
    $.ajax({
      url: "/drinks/"+prev+".json",
      type: "PUT",
      data: { id:prev, "drink[station_id]":"" }
    });
  }

  $(this).attr('data-rel',next);
});

$('.station-items option:selected').each(function(){
  return $(this).parent().attr('data-rel',$(this).val())
});
</script>