[RUBY] Rails Association hat eine Eins-zu-Viele-Beziehung zwischen Modellen

Einführung

Nach mir, einem Rails-Anfänger, werden Tabellen nach Assoziation zugeordnet Ich hatte große Probleme, die Parameter nicht an die Aktionsmethode zu übergeben, daher werde ich einen Artikel schreiben. Das Ziel ist es, Place (Café) Informationen über Menüs zu geben und diese auf dem Bildschirm auszugeben.

Überprüfen Sie vorerst die Spalten Ort und Menü

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"]

Es wird wie oben sein.

Der angemeldete Benutzer veröffentlicht sein Lieblingscafé → Menüinformationen können zu diesem Café hinzugefügt werden. Es ist eine Funktion namens.

Verbinden von Tabellen durch Zuordnung

app/models/place.rb


class Place < ApplicationRecord
  belongs_to :user
  has_many :menus
end

Achten Sie darauf, die Beschreibung dieser Singularform nicht mit der Pluralform zu verwechseln, da die Namenskonvention in Rails wichtig ist. Es hat (einen) Platz für (einen) Benutzer und (mehrere) Menüs für (einen) Platz.

gehört_zu (gehört zu) has_many (hat viel) ... Es ist leicht zu verstehen!

app/models/menu.rb


class Menu < ApplicationRecord
  belongs_to :place
end

menu.rb sieht so aus.

Die Verknüpfung zwischen den Tabellen ist vorerst abgeschlossen.

places_controller.rb


    [1] pry(#<PlacesController>)> @place
=> #<Place:0x00007f9d1e88cc10
 id: 3,
 name: "hoge Coffee",
 message: "Die ruhige Atmosphäre im nächsten Café von zu Hause aus ist sehr schön.",
 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>

Ich möchte das Menü unter views / sites / show.html.erb registrieren, also überprüfe die Parameter. Dies sind die Informationen des Cafés, in dem Sie das Menü dieses Mal registrieren möchten.

ruby:places/show.html.erb


  <%= link_to 'Menü registrieren', new_menu_path(id: @place.id) %>

Gehen Sie zur neuen Aktion von menus_controller, um das Menü zu registrieren.

Wenn Sie zu diesem Zeitpunkt kein Argument an den _path-Helfer übergeben, können Sie mit der neuen Aktion menus_controller nicht nach einem Ort suchen.

menus_controller.rb


class MenusController < ApplicationController

  def new
    @menu = Menu.new
    @place = Place.find_by(id: params[:id])
  end
(Abkürzung)

Eingabeformular ↓

ruby:menus/new.html.erb


<%= form_with model:@menu, local: true do |f| %>
<h2>Menü registrieren</h2>
<p>Der Name des Gerichts: <%= f.text_field :title %></p>
<p>Price : <%= f.text_field :price %></p>
<%= f.hidden_field :place_id, :value => @place.id %>
<%= f.submit 'zu registrieren' %>
<% end %>

Da place_id nicht eingegeben werden muss, erhält es den in hidden_field übergebenen Wert.

So erhalten Sie place_id in der Erstellungsaktion, erhalten es jedoch im Eingabeformular, wenn Sie das Menü registrieren.

menus_controller.rb


def create
    #Hier erhalten Sie die im Eingabeformular empfangenen Parameter
    @menu = Menu.create(
      title: menus_params[:title],
      price: menus_params[:price],
      place_id: menus_params[:place_id]
    )
    #Ich werde hier prüfen, ob ich es richtig erhalten habe
    binding.pry
end

(Unterlassung)

private

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

(Abkürzung)

Ich werde das Formular zur Bestätigung ausfüllen. Ergebnis···

python


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

Ich konnte die place_id richtig empfangen.

Jetzt können Sie Parameter empfangen, die eine richtige Eins-zu-Viele-Beziehung haben (Menüs für Ort).

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

Das registrierte Menü kann so ausgegeben werden.

[1] pry(#<PlacesController>)> @place.menus
  (Abkürzung)
=> [#<Menu:0x00007ffda376a4c8
  id: 37,
  title: "Schokoladenkuchen",
  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: "Eiskaffee",
  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>]

Da es durch Zuordnung verknüpft ist, können Sie das mit @ place.menus registrierte Menü überprüfen.

Recommended Posts

Rails Association hat eine Eins-zu-Viele-Beziehung zwischen Modellen
Verein (eins zu viele)! !!
Assoziation (Eins-zu-Viele-Beziehung)
[Rails] Model Association (Vereinigung)
Modellassoziation in Rails
Ruby On Rails Association