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