[RUBY] L'association Rails a une relation un-à-plusieurs entre les modèles

Introduction

Après moi, un débutant Rails, tables associées par association J'ai eu beaucoup de mal à ne pas passer les paramètres à la méthode d'action, je vais donc écrire un article. Le but est de donner à Place (café) des informations sur les menus et de les afficher à l'écran.

Vérifiez les colonnes Lieu et Menu pour le moment

irb(main):005:0> Place.column_names
=> ["id", "name", "message", "created_at", "updated_at", "user_id"]
irb(main):006:0> Menu.column_names
=> ["id", "title", "price", "message", "created_at", "updated_at", "place_id"]

Ce sera comme ci-dessus.

L'utilisateur connecté publie son café préféré → Les informations du menu peuvent être ajoutées à ce café. C'est une fonction appelée.

Rejoindre des tables par association

app/models/place.rb


class Place < ApplicationRecord
  belongs_to :user
  has_many :menus
end

Veillez à ne pas confondre la description de cette forme singulière avec la forme plurielle car la convention de dénomination est importante dans Rails. Il a (une) place pour (un) utilisateur et (plusieurs) menus pour (une) place.

appartient_à (appartient à) has_many (en a beaucoup) ... C'est facile à comprendre!

app/models/menu.rb


class Menu < ApplicationRecord
  belongs_to :place
end

menu.rb ressemble à ceci.

Pour le moment, la liaison entre les tables est terminée.

places_controller.rb


    [1] pry(#<PlacesController>)> @place
=> #<Place:0x00007f9d1e88cc10
 id: 3,
 name: "hoge Coffee",
 message: "L'atmosphère calme du café le plus proche de chez soi est très agréable.",
 created_at: Thu, 18 Jun 2020 00:05:20 UTC +00:00,
 updated_at: Thu, 18 Jun 2020 13:14:42 UTC +00:00,
 user_id: 1>
[2] pry(#<PlacesController>)> params
=> <ActionController::Parameters {"controller"=>"places", "action"=>"show", "id"=>"3"} permitted: false>

Je veux enregistrer le menu à partir de views / places / show.html.erb, alors vérifiez les paramètres. Ce sont les informations du café dont vous souhaitez enregistrer le menu cette fois.

ruby:places/show.html.erb


  <%= link_to 'Menu d'inscription', new_menu_path(id: @place.id) %>

Accédez à la nouvelle action de menus_controller pour enregistrer le menu.

Si vous ne passez pas d'argument à l'assistant _path pour le moment, vous ne pourrez pas rechercher un lieu avec la nouvelle action de menus_controller.

menus_controller.rb


class MenusController < ApplicationController

  def new
    @menu = Menu.new
    @place = Place.find_by(id: params[:id])
  end
(Abréviation)

Formulaire d'entrée ↓

ruby:menus/new.html.erb


<%= form_with model:@menu, local: true do |f| %>
<h2>Menu d'inscription</h2>
<p>Le nom du plat: <%= f.text_field :title %></p>
<p>Price : <%= f.text_field :price %></p>
<%= f.hidden_field :place_id, :value => @place.id %>
<%= f.submit 's'inscrire' %>
<% end %>

Puisque place_id n'est pas quelque chose à saisir, il recevra la valeur passée dans hidden_field.

Comment recevoir place_id dans l'action de création, mais le recevoir dans le formulaire de saisie lors de l'enregistrement du menu.

menus_controller.rb


def create
    #Recevez les paramètres reçus dans le formulaire de saisie ici
    @menu = Menu.create(
      title: menus_params[:title],
      price: menus_params[:price],
      place_id: menus_params[:place_id]
    )
    #Je vérifierai si je l'ai bien reçu ici
    binding.pry
end

(Omission)

private

  def menus_params
    params.require(:menu).permit(:title, :price, :place_id)
  end

(Abréviation)

Je remplirai le formulaire de confirmation. résultat···

python


[1] pry(#<MenusController>)> menus_params
=> <ActionController::Parameters {"title"=>"café glacé", "price"=>"280", "place_id"=>"3"} permitted: true>

J'ai pu recevoir correctement le place_id.

Vous pouvez maintenant recevoir des paramètres qui ont une relation un-à-plusieurs appropriée (menus pour place).

    <% @place.menus.each do |menu| %>
        <p><%= menu.title %> <%= menu.price %></p> 
    <% end %>

Le menu enregistré peut être affiché comme ceci.

[1] pry(#<PlacesController>)> @place.menus
  (Abréviation)
=> [#<Menu:0x00007ffda376a4c8
  id: 37,
  title: "Gateau au chocolat",
  price: 250,
  created_at: Thu, 18 Jun 2020 01:36:00 UTC +00:00,
  updated_at: Thu, 18 Jun 2020 01:36:00 UTC +00:00,
  place_id: 3>,
 #<Menu:0x00007ffda3773eb0
  id: 44,
  title: "café glacé",
  price: 280,
  created_at: Fri, 19 Jun 2020 00:24:50 UTC +00:00,
  updated_at: Fri, 19 Jun 2020 00:24:50 UTC +00:00,
  place_id: 3>]

Puisqu'il est lié par association, vous pouvez consulter le menu enregistré avec @ place.menus.

Recommended Posts

L'association Rails a une relation un-à-plusieurs entre les modèles
Association (un-à-plusieurs)! !!
Association (relation un-à-plusieurs)
[Rails] Association de modèles (Association)
Association de modèles dans Rails
Association Ruby On Rails