どうもチャンクノです。
二週間ぐらい前にやった、親子関係にないモデルを同時に更新するやり方を書きます。
まず親モデルとしてUserがあり、子モデルとしてUserProfileとUserAddressがあります。
この子モデルであるUserProfileとUserAddressは親子関係にありません。
これを同時に更新してみましょう。
最初に自分が書いたがコードこちら
必要ないところは省いて書いています。
User::UserProfilesController
def update
if @user_profile.update(user_profile_params) && @user_address.update(user_address_params)
end
private
def set_user_profile
@user_profile = current_user.user_profile
end
def set_user_address
@user_address = current_user.user_address
end
def user_profile_params
params.require(:user_profile).permit(:name)
end
def user_address_params
params.require(:user_address).permit(:zipcode)
end
view
<%= form_with model: [:user, @user_profile], local: true do |f| %>
<%= f.text_field :name %>
<%= fields_for @user_address, do |address| %> <= f.は不要。書き忘れじゃないよ。
<%= address.text_field :zipcode %>
<% end %>
<%= f.submit %>
<% end %>
こんな感じで書いた気がします。
これでも動きますが
def update
if @user_profile.update(user_profile_params) && @user_address.update(user_address_params)
end
ここの部分の記述がよくなかったらしく&&を使わずにまとめてくれと言われました。
正直最初それは無理じゃないか?と思ってましたができました。
まずは完成形から
User::UserProfilesController
def update
if current_user.update(user_profile_params)
end
private
def user_profile_params
params.require(:user).permit(
user_profile_attributes: [:name],
user_address_attributes: [:zipcode]
)
end
view
<%= form_with model: [:user, current_user], url: user_user_profile_path, local: true do |f| %>
<%= f.fields_for :user_profile, current_user.user_profile || current_user.build_user_profile do |profile| %>
<%= profile.text_field :name %>
<% end %>
<%= f.fields_for :user_address, current_user.user_address || current_user.build_user_address do |address| %>
<%= address.text_field :zipcode %>
<% end %>
<%= f.submit %>
<% end %>
こうです。
できるんかーい🙋♂️って感じでしたね。
自分ができないと思っていた理由はparams.require()の括弧の中身がコントローラー名と一致していないといけないと思ってたからです、、、。
なので、UserProfilesControllerでparams.require(:user)ってできなくね?って思ってたんですね。
コントローラー名は全く関係ないことを今更知りました、、、。
勉強になります。
初学者の方だとform_withの記述の仕方で不明点があると思うので、別途記事を書こうと思います!!
ひとまずこんな感じで書けば親子関係にないモデルを同時に更新することができます。
createも同じviewファイルを使ってできるはずです🙆♂️
そういえばここでは書いてないですがaccepts_nested_attributes_forという記述が親モデルに必要になります。ここは調べればすぐに出てくるのでご自身で調べてみてください!!
参考までに。
https://qiita.com/hiroweb/items/74867433ab5091713521
それでは今日はこの辺で!!
皆様よきプログラミングライフを🙏