0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rails 親子関係にないモデルを同時に更新してみよう。

Last updated at Posted at 2020-05-08

どうもチャンクノです。
二週間ぐらい前にやった、親子関係にないモデルを同時に更新するやり方を書きます。
まず親モデルとして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

それでは今日はこの辺で!!
皆様よきプログラミングライフを🙏

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?