代码之家  ›  专栏  ›  技术社区  ›  BC.

Rails窗体助手:处理复杂窗体和参数(这是我使用Rails的第一天)

  •  0
  • BC.  · 技术社区  · 14 年前

    我有以下表格更新购物车的数量。

    <% form_for(:cart, @cart.items, :url => { :action => "update_cart" }) do |f| %>
    <table>
        <tr>
            <th>Item</th>
            <th>Quantity</th>
            <th>Price</th>
        </tr>
        <% for item in @cart.items %>
            <% f.fields_for item, :index => item.id do |item_form| %>
            <tr>
                <td><%=h item.title %></td>
                <td><%=item_form.text_field :quantity, :size => 2 %>
                    <span>@ <%=h number_to_currency(item.item_price) %></span></td>
                <td><%=h number_to_currency(item.line_price) %></td>
            </tr>
            <% end %>
        <% end %>
        <tr>
            <td colspan="2">Total:</td>
            <td><%=h number_to_currency(@cart.total_price) %></td>
        </tr>
    </table>
    <%=submit_tag 'Update Cart' %>
    <% end %>
    

    def update_cart
      @cart = find_cart
    
      @cart.items.each do |item|
        quantity = params[:cart][:cart_item][item.id.to_s][:quantity].to_i
        @cart.update_quantity_for(item, quantity)
      end
    
      redirect_to :action => 'cart'
    end
    

    我没有用于购物车或购物车项目的REST接口控制器。有没有更好的方法来处理这种深参数数据结构?表达式 params[:cart][:cart_item][item.id.to_s][:quantity].to_i 我觉得对无效的表单数据很危险。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Corith Malin    14 年前

    正确的方法是在cart模型中使用“accepts\u nested\u attributes”属性。然后您可以使用CartController的update方法来保存您的项目( http://railscasts.com/episodes/196-nested-model-form-part-1 )