Generowanie listy rzeczy z koszyka

Witam!
Podążam za tutorialem ze strony : https://richonrails.com/articles/building-a-shopping-cart-in-ruby-on-rails

Stworzyłem koszyk do którego moge dodawać produkty.
W jaki sposób najlepiej byłoby wyświetlić je najlepiej jako lista, i jeśli jest ich więcej niż jeden to kolejne egzemplarze byłyby wyświetlane jako element listy.
Np:
3x produkt będzie wyświtlany jako
produkt
produkt
produkt
inny produkt

Chodzi mi tu o możliwości wydruku takich informacji. Jak najlepiej byłby to zrobić?
Pozdrawiam

Ja bym użył tagu

<ul> oraz <li>

W tym momencie koszyk wyświetla mi się tak:
carts/show.thml.erb

<div class="shopping-cart">
  <%= render "shopping_cart" %>
</div>

carts/_cart_row.html.erb

<div class="col-xs-8">
  <h4><%= barcode.name %>
         

  </h4>
</div>
<div class="col-xs-4">
  <%= form_for order_item, remote: true do |f| %>
   
    <div class="row">
      <div class="col-xs-4">
        <%= f.number_field :quantity, value: order_item.quantity.to_i, class: "form-control", min: 1 %>
        <%= f.hidden_field :barcode_id, value: barcode.id %>
      </div>
      <div class="col-xs-8 text-right">
        <div class="btn-group">
          <%= f.submit "Update Quantity", class: "btn btn-primary" %>
          <%= link_to "Delete", order_item, { data: { confirm: "Are you sure you wish to delete the barcode '#{order_item.barcode.name}' from your cart?" }, method: :delete, remote: true, class: "btn btn-danger" } %>
        </div>
      </div>
    </div>
  <% end %>
</div>

carts/_shopping_cart.html.erb

<% if !@order_item.nil? && @order_item.errors.any? %>

    <% @order_item.errors.full_messages.each do |msg| %>
  • <%= msg %>
  • <% end %>
<% end %> <% if @order_items.size == 0 %>

There are no items in your shopping cart. Please <%= link_to "go back", root_path %> and add some items to your cart.

<% else %> <% @order_items.each do |order_item| %> <%= render 'carts/cart_row', barcode: order_item.barcode, order_item: order_item, show_total: true %> <% end %> <% end %>

routes.rb

resource :cart, only: [:show]
resources :order_items, only: [:create, :update, :destroy]

Czy należy dodać nowy np widok w carts?

class CartsController < ApplicationController
  def show
    @order_items = current_order.order_items
  end
end

ten show to tak naprawdę akcja index w OrderItemsControllerCartsController można wyrzucić i w routes dodać:

# routes.rb 
get '/cart', to: 'OrderItems#index', as: 'cart'
class OrderItemsController < ApplicationController

   def index
     @order_items = current_order.order_items
   end

  def create
    [...]

Brakuje kontroli gdzie chcesz wylądować w razie nie udanego zapisu w akcjach OrderItemsController#create i OrderItemsController#update

podpowiedź dla akcji create

   def create
    @order = current_order
    @order_item = @order.order_items.new(order_item_params)
    if @order.save
      # udało się utworzyć item
      session[:order_id] = @order.id
      # tu jakiś redirect_to ... tam gdzie chciałbyś być po udanym dodaniu produktu
      # pewnie spowrotem na produkcie :)
    else
      # tutaj @order.save zwróciło false coś poszło nie tak
      # więc pewnie render 'index'
    end
  end

to rozwiązanie nie jest doskonałe - proponuje zrobić testy tego kontrolera

i dla create, update puścić śmieci w params quantity: 'abc', product_id: 'cba'

podobnie dla destroy wysłać coś nietypowego id: 'chocolate' lub nieistniejący numer

dojdzie obsługa wyjątków i/lub mocniejsze filtrowanie parametrów

Pozdrawiam

Dzięki za wytyczne! Sprawdzę
W jaki sposób najłatwiej wyświetliłbyś listę z koszyka? Potrzebuje po prostu wygenerować ciągiem listę do wydruku. Czy dodać nowy widok w carts_items?
W jaki sposób to powinno być zrobione wg. Ciebie?

Np:


<%= order_item.quantity.times do %>

<%= barcode.name %>


<%= barcode.barcode %>


<% end %>

jeżeli chcesz się bawić w link na stronie “wersja do druku” to odzielny css/widok - tą drogą nigdy nie szedłem :slight_smile: trzeba by obgooglać “printable css” “design for printing” etc.

wydruk jak dla mnie to plik PDF otworzy się na każdym urządzeniu mobilnym i wydrukuje wszędzie

Są narzędzia rubiego drukujące HTML/CSS => PDF ale te rozwiązania nie były tak precyzyjne jak Prawn gdy szukałem czegoś do wydruku, potrzebowałem precyzji do drukowania “wycinanek”, polubiłem Prawna i jego mogę polecić - teraz ma całkiem ładny manual

Myślę, że niezależnie od Twoich aktualnych potrzeb Prawn jest wart poznania, bo w wielu stackach go znajdziesz

Pozdrawiam