Rails формирует хелпер: работа со сложными формами и параметрами (это мой первый день с рельсами) - PullRequest
0 голосов
/ 25 июля 2010

Изучение рельсов и что-то пахнет немного смешно.

У меня есть следующая форма для обновления количества в корзине.

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

В своем действии update_cart я перебираю существующие элементы корзины и устанавливаю новое количество:

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? Выражение params[:cart][:cart_item][item.id.to_s][:quantity].to_i кажется мне опасным для неверных данных формы.

1 Ответ

2 голосов
/ 25 июля 2010

Правильный способ сделать это - использовать атрибут «accepts_nested_attributes» в модели корзины. Тогда вы можете просто использовать метод обновления CartController для сохранения ваших товаров. (http://railscasts.com/episodes/196-nested-model-form-part-1)

Кроме того, ваша общая цена, вероятно, должна соответствовать методу, определенному в модели корзины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...