Ich möchte Modelle einer 1: 1-Beziehung zuordnen, damit alle Modelldaten gleichzeitig an das Formular gesendet werden können. Mit anderen Worten, der Zweck dieser Zeit besteht darin, zwei Datenmodelle innerhalb der Formularmethode verarbeiten zu können.
Dieses Mal machen wir das Benutzermodell und das User_profile-Modell zu einer 1: 1-Beziehung, sodass beide Benutzerinformationen gleichzeitig in der Formularmethode bearbeitet werden können.
M
Migrationsdatei
class CreateUserProfiles < ActiveRecord::Migration[6.0]
def change
create_table :user_profile do |t|
t.string :twitter_url
t.string :program_lang
t.string :image
t.references :user, foreign_key: true
t.timestamps
end
end
end
t.references :user, foreign_key: true
Durch Festlegen eines externen Schlüssels werden das Benutzermodell und das Benutzerprofilmodell verknüpft.
$ rails db:migrate
models/user_profile.rb
class Prof < ApplicationRecord
belongs_to :user
end
models/user.rb
class User < ApplicationRecord
has_one :user_profile
accepts_nested_attributes_for :user_profile
end
accept_nested_attributes_for: user_profile
ist bei verschachtelten Formulardaten.
Insbesondere kann es zum Zeitpunkt starker Parameter in Form von "{user: {user_profile_attributes: {program_lang: 〇〇, twitter_url: 〇〇, image: 〇〇}}}" zusammengefasst werden.
C
users_controller.rb
def create
@user = User.new(user_params)
@user.build_user_profile
if @user.save
・ ・ ・
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password, user_profile_attributes: [:id, :program_lang, :twitter_url, :image])
end
Was Sie hier beachten sollten, ist "@ user.build_user_profile". Wenn Sie im Voraus keine Instanz des Modells user_profile erstellt haben, wird das Formular auf der Ansichtsseite nicht angezeigt.
V
ruby:edit.html.erb
.container
= form_with model: @user, local: true do |form|
= form.fields_for :user_profile do |prof|
.form-image
= prof.file_field :image
.form-group
= form.text_field :name
= form.text_field :email
= form.fields_for :user_profile do |prof|
.form-group
= prof.text_field :program_lang
= prof.text_field :twitter_url
.row
= form.submit "Bearbeiten"
Es ist fields_for
, das noch weitere Modelldaten im Formular erkennt.
Durch Erstellen eines Formulars innerhalb des Formulars können Sie die Daten stapelweise an die Serverseite senden, indem Sie einfach auf die Schaltfläche "Bearbeiten" klicken.
Recommended Posts