[RUBY] Créer un site EC avec Rails5 ⑦ ~ Adresse, modèle de genre ~

introduction

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.

Code source

https://github.com/Sn16799/bakeryFUMIZUKI

Association de modèles

association.jpg

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

écran d'index

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>

écran d'édition

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>

afficher l'écran

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

* Modèle partiel

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.

assistant

app/helpers/application_helper.rb


  def price_include_tax(price)
    price = price * 1.08
    "#{price.round}Cercle"
  end

Postscript

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

Créer un site EC avec Rails5 ⑦ ~ Adresse, modèle de genre ~
Créer un site EC avec Rails5 ⑤ ~ Modèle client ~
Créer un site EC avec Rails 5 ⑩ ~ Créer une fonction de commande ~
Créer un site EC avec Rails 5 ⑨ ~ Créer une fonction de panier ~
Créer un site EC avec Rails5 ④ ~ En-tête et pied de page ~
Créez un site EC avec Rails5 ⑥ ~ entrée de données de départ ~
Créer un site EC avec Rails5 ③-Définir des associations de modèles et d'autres choses-
Créer un site EC avec Rails5 ② ~ Paramètres Bootstrap4, définition du contrôleur / action ~
Création d'un site EC avec Rails5 ①-Configuration de l'application, préparation de divers gemmes, création de modèle / routage-
Créez un site EC en utilisant des rayures! (Création de compte)
[Rails] Créer une application
Création d'un site EC avec Rails5 ⑧ ~ Modèle de produit, affichage restreint conditionnel pour les parents et les enfants ~
Créer un service avec un modèle vide Liferay 7.0 / DXP
[Rails] Fonction de panier de site EC
Créer une classe immuable avec JAVA
Créer un portfolio avec rails + postgres sql
Créez une application avec Spring Boot 2
Créer un site de catalogue d'applications à l'aide de l'interface de ligne de commande pour Microsoft 365 avec Docker
[Rails] Conception de bases de données pour le site EC
Créer une fonction de pagination avec Rails Kaminari
Créer un fichier Excel avec POI
Créez une application avec Spring Boot
Créer ma page avec Rails
Créons vous-même une instance avec .new. .. ..
[Java] Créer un module exécutable avec Gradle
[Rails6] Créer une nouvelle application avec Rails [Débutant]
Déploiement facile avec Capistrano + AWS (EC2) + Rails
Construire un environnement Rails 6 + MySQL avec Docker compose
[Retrait des rails] Créez une fonction de retrait simple avec des rails
[Rails 5] Créer une nouvelle application avec Rails [Débutant]
[Ruby on Rails] Test de modèle avec RSpec
Faisons un écran d'erreur avec Rails
Nuxt.js × Créer une application en mode API Rails
Rétrograder une application existante créée avec les rails 5.2.4 vers 5.1.6
[Rails] rails nouveau pour créer une base de données avec PostgreSQL
Créez une API JSON prenant en charge le cryptage RSA avec wicket
Obtenir le modèle enfant avec les rails created_at desc scope
Créez une discussion d'équipe avec Rails Action Cable
Créer une application en spécifiant la version de Rails
Rails6.0 ~ Comment créer un environnement de développement respectueux de l'environnement
Créer un annotateur qui utilise kuromoji avec NLP4J [007]
Comment créer des variables membres avec le modèle JPA
[Rails] Comment créer un environnement avec Docker