[RUBY] Je souhaite implémenter une fonction d'édition des informations produit ~ part1 ~

supposition

--Utilisez ruby sur les rails 6.0.0.

introduction

Je fais une copie du site d'un certain site frima pour apprendre la programmation. J'ai implémenté une fonction d'édition des informations produit, mais j'ai eu du mal à publier plusieurs images, j'ai donc décidé de l'écrire comme référence. Bien que ce ne soit pas une grande quantité, il est divisé en parties afin que vous puissiez avoir un sentiment d'accomplissement lorsque vous le verrez plus tard. s'il vous plaît, pardonnez-moi. (J'ai beaucoup écrit! Je veux être) Je ne pense pas qu'il y ait quoi que ce soit qui reste coincé dans la partie 1, mais comme ce sera la base de la partie 2 et plus tard, je vais écrire sur l'échauffement.

spécification

(Je publierai une image de référence lorsque le balisage sera terminé)

procédure

1, création d'un contrôleur de base et d'un modèle. 2, implémentez la publication d'image en associant la table d'image. 3, Introduction de jQuery pour implémenter la publication de plusieurs images. 4, ajustement sur l'écran d'édition. 5, prévisualisez l'image.

Nous mettrons en œuvre chacune de ces cinq étapes séparément.

Eh bien

Implémenter

Tout d'abord, solidifiez la partie de base. D'abord depuis le terminal.

$ rails g contoroller products $ rails g model product $ rails db:migrate

C'est le flux habituel. Les détails tels que la création d'une base de données et la description d'un fichier de migration seront omis.

Commençons par le fichier racine.

app/config/routes.rb


Rails.application.routes.draw do
  root "products#index"
  resources :products
  devise_for :users, controllers: {
    registrations: 'users/registrations'
  }
end

La partie conception est liée aux fonctions utilisateur qui ont été implémentées à l'avance, vous n'avez donc pas à vous en soucier. Aucune explication détaillée n'est nécessaire ici non plus. J'ai fait une action de base avec des ressources et spécifié une action d'index dans le chemin racine. (Cette fois, détruire et afficher ne sont pas utilisés, vous pouvez donc les exclure.)

Vient ensuite la description du contrôleur.

app/controllers/products_controller.rb


class ProductsController < ApplicationController
  before_action :ensure_current_user, only[:edit, :update]
  before_action :set_product, only[:new, :create, :edit, :update]

  def index
    @products = Product.all
  end

  def new
    @prodcut = Product.new
  end
  def create
    @product = Product.new(product_params)
    if @product.save
      redirect_to products_path
    else
      render :new
    end
  end

  def edit
  end
  def update
    if @product.update(product_params)
      redirect_to products_path
    else
      render :edit
    end
  end

  private
  def product_params
    params.require(:product).permit(:name).merge(user_id: current_user.id)
  end
  def ensure_current_user
    product = Product.find(params[:id])
    if product.user_id != current_user.id
      redirect_to action: :index
    end
  end
  def set_product
    @product = Product.find(params[:id])
  end
end

Est-ce un tel endroit pour le moment? Je vais vous expliquer étape par étape.

Tout d'abord, sur les actions de base.

@products = Product.all

Il n'y a pas de problème avec l'index, tous les enregistrements enregistrés dans la table product sont récupérés.

@prodcut = Product.new

Les produits sont enregistrés dans nouveau et créent. Créez un nouvel objet dans le modèle .new et attribuez-lui les valeurs de formulaire.

def product_params  params.require(:product).permit(:name).merge(user_id: current_user.id) end

Les données envoyées de cette manière sont reçues par la méthode product_params. C'est un paramètre fort que tout le monde aime. La colonne n'est que nom car elle n'implémente que la fonctionnalité minimale.

if @product.save  redirect_to products_path else  render :new end

L'instruction if suivante, c'est celle appelée gestion des erreurs. Si le processus réussit, l'index s'affiche et si le processus échoue, nouveau s'affiche à nouveau. Il y a des parties compliquées dans le concept, mais je pense que vous connaissez déjà les fonctions.

@product = Product.find(params[:id])

Viennent ensuite les actions d'édition et de mise à jour, mais ce que nous faisons est le même qu'avant. La différence avec create est que vous n'avez pas besoin de créer un nouvel objet car les données existent déjà et que vous apportez le produit sélectionné par la méthode find.

def ensure_current_user  product = Product.find(params[:id])   if product.user_id != current_user.id   redirect_to action: :index  end end

Enfin, la méthode ensure_current_user. Cela peut sembler difficile à première vue, mais le processus est très simple. Le fait est que si les informations utilisateur du produit sélectionné et les informations utilisateur connecté sont différentes, vous ne pouvez pas les modifier.

Maintenant que la description du contrôleur est terminée, il est temps d'écrire le fichier de vue.

haml:app/view/products/index.html.haml


- if user_signed_in?
  - @products.each do |product|
    - if product.user_id == current_user.id
      = link_to edit_product_path(product.id) do
        #{product.name}
  = link_to("Référencement", new_product_path)

  %h2 connecté
  = link_to 'Se déconnecter', destroy_user_session_path, method: :delete

- else
  %h2 non connecté
  = link_to 's'inscrire', new_user_registration_path
  = link_to 'S'identifier', new_user_session_path

Commençons par l'index, mais seules les six premières lignes doivent être notées. L'utilisateur est-il connecté? Le produit est-il enregistré par l'utilisateur? Sous deux conditions telles que, l'édition et les nouveaux chemins sont affichés.

haml:app/views/products/_form.html.haml


= form_with model: @product, local: true do |f|
  = f.text_field :name, placeholder: 'name'
  = f.submit 'SEND'

Je ne pense pas non plus qu'il y ait quelque chose de spécial à expliquer ici. Vous utilisez la méthode form_with pour envoyer des données au modèle de produit. Il ne vous reste plus qu'à afficher ceci comme modèle partiel dans new.html.haml et edit.html.haml comme rendu.

finalement

À ce stade, vous avez implémenté la possibilité de créer des données produit et de les modifier. (La colonne est juste le nom, mais ...)

Dans les spécifications,

Cela signifie que nous avons pu effacer ces trois éléments. Dans la partie suivante, nous pourrons ajouter des images (tableau d'images), veuillez donc rester en contact.

Je souhaite implémenter une fonction d'édition des informations produit ~ part2 ~

Recommended Posts

Je souhaite implémenter une fonction d'édition des informations produit ~ part1 ~
"Professeur, je souhaite implémenter une fonction de connexion au printemps" ① Hello World
Je souhaite définir une fonction dans la console Rails
Je souhaite ajouter une fonction de suppression à la fonction de commentaire
Je veux créer une fonction avec kotlin et java!
Je souhaite ajouter une fonction de navigation avec ruby on rails
Je souhaite développer une application web!
Je veux écrire un test unitaire!
[Ruby] Je veux faire un saut de méthode!
[Android] Implémentez rapidement la fonction pour afficher le mot de passe
Je veux écrire une simple répétition d'une chaîne de caractères
Je souhaite concevoir une structure pour la gestion des exceptions
J'ai essayé d'implémenter un serveur en utilisant Netty
J'ai essayé d'implémenter une fonction équivalente à Felica Lite avec HCE-F d'Android
Je veux utiliser une petite icône dans Rails
Je souhaite surveiller un fichier spécifique avec WatchService
J'ai essayé de créer une fonction de connexion avec Java
[Java] J'ai essayé de mettre en œuvre la recherche de produits de l'API Yahoo
Je veux cliquer sur une broche GoogleMap dans RSpec
Je souhaite créer une annotation générique pour un type
J'ai essayé de créer une fonction de message de l'extension Rails Tutorial (Partie 1): Créer un modèle
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 1 (édition API)
Je souhaite l'implémenter en plus lors de l'utilisation de kotlin sur un site exécutant Java
J'ai essayé d'implémenter la fonction similaire par communication asynchrone
[Java] Je souhaite convertir un tableau d'octets en un nombre hexadécimal
Je souhaite générer des informations de manière aléatoire lors de l'écriture du code de test
Je veux trouver un chemin relatif dans une situation où Path est utilisé
Je veux convertir des caractères ...
Je souhaite créer un modèle spécifique d'ActiveRecord ReadOnly
Je veux faire une liste avec kotlin et java!
Je veux appeler une méthode et compter le nombre
Je souhaite créer un formulaire pour sélectionner la catégorie [Rails]
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
Je veux donner un nom de classe à l'attribut select
Je veux créer un fichier Parquet même en Ruby
J'ai essayé de créer une fonction de message pour l'extension Rails Tutorial (Partie 2): Créer un écran à afficher
J'ai essayé d'implémenter une application web pleine de bugs avec Kotlin
Je veux implémenter diverses fonctions avec kotlin et java!
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 2 (édition client)
Je souhaite utiliser FireBase pour afficher une chronologie comme Twitter
Je souhaite rechercher de manière récursive des fichiers dans un répertoire spécifique
[Rails] Un moyen simple d'implémenter une fonction d'auto-introduction dans votre profil
Je veux créer un bouton avec un saut de ligne avec link_to [Note]
Je souhaite utiliser le balayage arrière sur un écran qui utilise XLPagerTabStrip
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 1)
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 5):
Je veux extraire entre des chaînes de caractères avec une expression régulière
J'ai essayé de créer une fonction de groupe (babillard) avec Rails
Essayez d'implémenter la fonction Widget iOS14
J'ai fait une simple fonction de recommandation.