Param我试图通过隐藏字段显示为对象?

时间:2017-12-07 17:49:12

标签: ruby-on-rails e-commerce shopping-cart

我正在尝试使用表单中的隐藏字段将值为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的值,如果它是一个对象,对吧?如果您需要更多信息,请与我们联系。谢谢!

2 个答案:

答案 0 :(得分:1)

您的表单中有以下内容:

<%= form_for item do |f| %>
  <%= f.hidden_field :update_by, value: 1 %>
  ...
<% end %>

itemOrderItem。这意味着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 %>

如果您对此解决方案有解释,请告诉我们。我们都是新手。谢谢!