gpt4 book ai didi

ruby-on-rails - Rails 在参数中为 M 到 M 关联形成传递数组

转载 作者:行者123 更新时间:2023-12-04 03:40:33 25 4
gpt4 key购买 nike

编辑:本质上是希望通过这样的东西:

{
'tabled_id' : '1',
'recipes' : [{
{ 'recipe_id' : '3',
'quantity' : '2'
}
{ 'recipe_id' : '5',
'quantity' : '1'
}
}]
}

而且我认为我应该在 Controller 端执行 params.require(:order).permit(:table_id, {recipes:, [:id,:quantity]} )

我正在学习 Rails 构建一个订购系统,但我一直在尝试为传递数量的订单构建一个表单。其中 Orders 是 Restaurant 的嵌套资源。

我的模型是这样的:

class Restaurant < ActiveRecord::Base
has_many :orders
has_many :recipes, dependent: :destroy
end

class Order < ActiveRecord::Base
belongs_to :restaurant
has_many :order_recipes, dependent: :destroy
has_many :recipes, through: :order_recipes
end

class Recipe < ActiveRecord::Base
belongs_to :restaurant
has_many :order_recipes
has_many :orders, through: :order_recipes
end

查看:

    <%= form_for([@restaurant, @order]) do |order_form| %>
<%= order_form.label :Table_Number %>
<%= order_form.number_field :table_id %>

<h3>Recipes: </h3>
<br>

<% @restaurant.recipes.each do |recipe| %>
<%= order_form.fields_for :recipe, recipe do |r| %>
<%= r.label recipe.name %>
<%= r.hidden_field :id %>
<%= r.number_field :quantity %>
<% end %>
<% end %>

<%= order_form.submit(@order.new_record? ? "Create Order" : "Edit Order", class: "btn btn-success") %>
<% end %>

这将生成一个看起来正确的表单,但不会传递所有参数。假设我有 3 个食谱。我分别将它们的数量设置为 2、3、4,并将 table_id 设置为 1。当我检查参数时,我看到只有最后一个配方及其数量已通过。 params[:order] => {"table_id"=>"1", "recipe"=>{"id"=>"4", "quantity"=>"4"}} 我需要能够发送所有食谱及其分配的数量。此外,我在这个问题中使用接受的答案来访问数量列:Rails 4 Accessing Join Table Attributes

最佳答案

当您多次提交 fields_for :recipes 时,fields_for 方法不知道您发送了一个数组。因此它将命名参数,就好像它只是一个实例,所以只有最后一个实例会通过。您必须将食谱数组交给 fields_for,这样它才能命名参数,这样当它再次被拾取时,rails 就知道它是一个数组 (docs)。这是因为浏览器中的表单参数默认不支持嵌套。实际参数是平面键值参数。 Rails 有一些 naming conventions关于如何命名参数,因此它们将自动被强制转换为数组。

<%= form_for([@restaurant, @order]) do |order_form| %>
<%= order_form.label :Table_Number %>
<%= order_form.number_field :table_id %>

<h3>Recipes: </h3>
<br>


<%= order_form.fields_for :recipes, @restaurant.recipes do |r| %>
<%= r.label recipe.name %>
<%= r.hidden_field :id %>
<%= r.number_field :quantity %>
<% end %>


<%= order_form.submit(@order.new_record? ? "Create Order" : "Edit Order", class: "btn btn-success") %>
<% end %>

关于ruby-on-rails - Rails 在参数中为 M 到 M 关联形成传递数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31774303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com