Ruby on rails 在表单中为一个站点添加4种饮料
我有两种型号:车站和饮料 车站有很多:饮料和饮料属于:车站 我正在尝试制作我的表单,这样当你创建一个站点时,你可以选择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 =
<%= 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>