我正在尝试使用表单中的隐藏字段将值为1的参数传递给控制器中的方法,该方法会将值添加到购物车中订单商品的数量。当我通过绑定pry检查我得到的内容时,我看到params
:我尝试传递的:update_by param显示为对象"order_items=>{"update_by"=>"1"}
。因此,当我尝试使用params[:update_by]
在方法中获取参数时,我得到nil(如果.to_i
则为0)。为什么param是一个对象?
请参阅html表格
<% if @order_items.any? %>
<% @order_items.each do |item| %>
<%= form_for item do |f| %>
<%= f.hidden_field :update_by, value: 1 %>
<%= button_tag type:"submit", class: "cart_quantity_button"
do %>
<i class="fa fa-plus-circle" aria-hidden="true"></i>
<% end %>
<% end %>
<% end %>
控制器中的方法
def update
@order = current_order
@item = OrderItem.find(params[:id])
@item.update(:quantity=> @item.quantity + params[:update_by].to_i)
@item.save!
redirect_to cart_path
end
private
def item_params
params.require(:order_item).permit(:quantity, :product_id,
:user_id, :update_by)
end
end
我正在从我的方法中的其他变量中获取我想要的数据。问题是我无法获取:update_by的值,如果它是一个对象,对吧?如果您需要更多信息,请与我们联系。谢谢!
答案 0 :(得分:1)
您的表单中有以下内容:
<%= form_for item do |f| %>
<%= f.hidden_field :update_by, value: 1 %>
...
<% end %>
和item
是OrderItem
。这意味着f
方法产生的所有内容(例如f.hidden_field
)将存在于order_item
命名空间内。因此
"order_item"=>{"update_by"=>"1"}
在您的控制器中。您还可以在item_params
控制器方法中看到这一点:
def item_params
params.require(:order_item).permit(:quantity, :product_id, :user_id, :update_by)
end
end
require
来电意味着您正在寻找"order_item"
而permit
来电意味着您正在寻找内的内容 > "order_item"
。
您应该使用item_params
方法解压缩参数:
@item.update(:quantity => @item.quantity + item_params[:update_by].to_i)
答案 1 :(得分:0)
我的朋友通过将参数的值移动到按钮而不是隐藏的表单字段来为我找到解决方案。
<%= form_for (item) do |f| %>
<% button_tag type:"submit", :value => item.quantity.to_i + 1, class: "cart_quantity_button" do %>
<p><i class="fa fa-plus-circle" aria-hidden="true"></i></p>
<% end %>
<% end %>
<%= form_for (item) do |f| %>
<% button_tag type:"submit", :value => item.quantity.to_i - 1, class: "cart_quantity_button" do %>
<p><i class="fa fa-minus-circle" aria-hidden="true"></i></p>
<% end %>
<% end %>
如果您对此解决方案有解释,请告诉我们。我们都是新手。谢谢!