我试图通过隐藏字段的参数是否显示为对象?

Param I'm trying to pass through hidden field is showing as an object?

我正在尝试使用表单中的隐藏字段将值为 1 的参数传递给控制器​​中的方法,这会将值添加到购物车中的订单商品数量。当我检查绑定撬动的结果时,我看到对于 params,我尝试传递的 :update_by 参数显示为一个对象 "order_items=>{"update_by"=>"1"}。因此,当我尝试使用 params[:update_by] 获取方法中的参数时,我得到 nil(如果 .to_i 则为 0)。为什么参数是对象?

请参阅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 的值,对吗?如果您需要更多信息,请告诉我。谢谢!

我的朋友通过将参数的值移动到按钮而不是隐藏的表单字段为我找到了解决方案。

  <%= 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 %>

如果您对此解决方案有任何解释,请告诉我。我们都是菜鸟。谢谢!

你的表格是这样的:

<%= 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调用意味着你正在寻找里面的那些东西[=36] =] "order_item".

您应该使用您的 item_params 方法解压参数:

@item.update(:quantity => @item.quantity + item_params[:update_by].to_i)