Il s'agit d'une suite de la série "Créer un site EC avec Rails 5 ⑥" (https://qiita.com/GreenFingers_tk/items/876bd51eb79acaa2bc5a), qui crée un site EC où vous pouvez faire vos achats dans une boulangerie fictive. Cette fois, nous reviendrons sur l'implémentation du corps principal de l'application et créerons la zone autour du modèle Address qui gère l'adresse de destination du pain acheté et le modèle Genre qui organise les produits.
https://github.com/Sn16799/bakeryFUMIZUKI
Address controller
app/controllers/addresses_controller.rb
class AddressesController < ApplicationController
before_action :authenticate_customer!
before_action :set_customer
def edit
@address = Address.find(params[:id])
if @address.customer_id != current_customer.id
redirect_back(fallback_location: root_path)
flash[:danger] = 'Je ne parviens pas à accéder à la page que je recherche.'
end
end
def index
@address = Address.new
@addresses = @customer.addresses
end
def create
@address = @customer.addresses.build(address_params)
if @address.save
flash[:success] = 'J'ai enregistré une nouvelle adresse!'
redirect_to addresses_path
else
@addresses = @customer.addresses
flash[:danger] = 'Veuillez vérifier le contenu d'entrée. Chaque champ de saisie est-il rempli de deux caractères ou plus?'
render :index
end
end
def update
@address = Address.find(params[:id])
if @address.update(address_params)
flash[:success] = 'Les informations d'adresse ont été mises à jour!'
redirect_to addresses_path
else
flash[:danger] = 'Veuillez vérifier le contenu d'entrée. Chaque champ de saisie est-il rempli de deux caractères ou plus?'
render :edit
end
end
def destroy
@address = Address.find(params[:id])
@address.destroy
flash[:info] = 'L'adresse enregistrée a été supprimée.'
redirect_to addresses_path
end
private
def set_customer
@customer = current_customer
end
def address_params
params.require(:address).permit(:post_code, :address, :addressee)
end
end
html:app/views/addresses/index.html.erb
<div class="col-lg-10 offset-lg-1 offset-1 space">
<div class="container-fluid">
<h2>
<span style="display: inline-block;">Adresse de livraison</span>
<span style="display: inline-block;">enregistrement/liste</span>
</h2>
</div>
<!--Nouveau formulaire d'adresse-->
<div class="container space">
<h3>Enregistrer une nouvelle adresse</h3>
<%= form_with(model: @address, local: true, class: 'container-fluid') do |f| %>
<div class="form-group">
<%= f.label :Code postal (sans tirets)%>
<%= f.text_field :post_code, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :adresse de rue%>
<%= f.text_field :address, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :adresse%>
<%= f.text_field :addressee, class: 'form-control' %>
</div>
<div class="action w-25 offset-lg-11">
<%= f.submit 's'inscrire', class: 'btn btn-danger' %>
</div>
<% end %>
</div>
<!--Liste d'adresses-->
<div class="container space">
<h3>Liste d'adresses</h3>
<div class="row">
<div class="col-lg-3">
<strong>Code postal</strong>
</div>
<div class="col-lg-3">
<strong>adresse de rue</strong>
</div>
<div class="col-lg-3">
<strong>adresse</strong>
</div>
</div>
<% @addresses.each do |address| %>
<div class="row">
<div class="col-lg-3">
<%= address.post_code %>
</div>
<div class="col-lg-3">
<%= address.address %>
</div>
<div class="col-lg-3">
<%= address.addressee %>
</div>
<div class="col-lg-3">
<%= link_to "Éditer", edit_address_path(address), class:"btn btn-danger" %>
<%= link_to "effacer", address_path(address), method: :delete, class:"btn btn-danger" %>
</div>
</div>
<% end %>
</div>
</div>
html:app/views/addresses/edit.html.erb
<div class="col-lg-10 offset-lg-1 space">
<div class="container">
<h2>Modifier l'adresse de livraison</h2>
<%= form_with(model: @address, local: true) do |f| %>
<div class="form-group">
<%= f.label :Code postal (sans tirets)%>
<%= f.text_field :post_code, autofocus: true, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :adresse de rue%>
<%= f.text_field :address, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :adresse%>
<%= f.text_field :addressee, class: 'form-control' %>
</div>
<div class="action w-25 offset-lg-11">
<%= f.submit 'Mise à jour', class: 'btn btn-danger' %>
</div>
<% end %>
</div>
</div>
Genre controller
app/controllers/genres_controoler.rb
class GenresController < ApplicationController
def show
@genre = Genre.find(params[:id])
@genres = Genre.where(validity: true)
@products = @genre.products.page(params[:page]).per(9)
end
private
def genre_params
params.require(:genre).permit(:name,:id)
end
end
index Bien que le nom du fichier soit index, il n'y a pas d'écran de liste de genre de produit, et ce fichier est appelé comme modèle partiel sur certaines pages afin qu'il puisse être réduit par genre. C'est essentiellement une barre latérale.
html:app/views/genres/_index.html.erb
<div id="sidebar" class="col-lg-2">
<table class='table'>
<thead>
<tr>
<th>Recherche par genre</th>
</tr>
</thead>
<tbody>
<% genres.each do |genre| %>
<tr>
<td><%= link_to genre.name, genre_path(genre) %></td>
</tr>
<% end %>
<tr>
<td><%= link_to "⇒ Voir tous les produits", products_path, class: 'dark-blue-letter' %></td>
</tr>
</tbody>
</table>
</div>
L'écran détaillé du genre de produit doit être un écran qui se rétrécit et affiche les produits appartenant au genre tels que «pain» et «pain d'accompagnement».
html:app/views/genres/show.html.erb
<div class="col-lg-10 space">
<div class="container">
<h2><%= @genre.name %>Tout lister<%= @genre.products.count %>la graine)</h2>
</div>
<div class="container">
<% @genre.products.each do |gp| %>
<%= render 'products/box', product: gp %>
<% end %>
</div>
</div>
<%= render 'genres/index', genres: @genres %>
html:app/views/products/_box.html.erb
<div class="col-lg-4 product-box space">
<%= link_to product_path(product) do %>
<div class="row">
<h4><%= product.name %></h4>
</div>
<div class="row">
<%= attachment_image_tag(product, :image, :fill, 220, 180, fallback: 'no_img.jpg') %>
</div>
<% end %>
<div class="row">
<h4><%= price_include_tax(product.price) %></h4>
</div>
</div>
Seuls les prix ** hors taxe ** sont stockés dans la base de données, mais je souhaite définir le prix ** hors taxe ** à l'écran. Dans un tel cas, utilisez la méthode d'assistance.
app/helpers/application_helper.rb
def price_include_tax(price)
price = price * 1.08
"#{price.round}Cercle"
end
Address et Genre n'ont que des fonctions CRUD standard, donc je pense que j'ai pu le faire presque sans hésitation. Ce sera difficile à partir de maintenant ... Le modèle de commande avec la fonction de commande posait beaucoup de problèmes lorsque je l'ai fait auparavant, mais puis-je en faire un écran réactif et le reproduire avec un code plus concis? Continuez à la prochaine fois!
Recommended Posts