Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【調査】accept_nested_attributes_for について調査する #13

Closed
ms2sato opened this issue Nov 4, 2018 · 5 comments
Closed
Assignees

Comments

@ms2sato
Copy link
Collaborator

ms2sato commented Nov 4, 2018

今後なくなっていくとも言われていますが、便利な機能で多くのプロジェクトに導入されている機能です。一度調べてみてください。調査の結果をこのIssueに貼ってくれると嬉しいです。

@ms2sato ms2sato changed the title accept_nested_attributes_for について調査する 【調査】accept_nested_attributes_for について調査する Nov 4, 2018
@jonakp
Copy link
Owner

jonakp commented Nov 5, 2018

@ms2sato
調査結果を以下に記載します。
ご確認お願いします。
(コード書いてみての調査はまだなので、後程更新するかもしれません。)

accepts_nested_attributes_for について

概要

  • Relationを利用して、親子関係にあるModelのAttributeを一括で作成・更新できるモジュール(?)
  • Modelと画面上のフォームが1対1で一致しない場合に使える実装方法の1つ

使い方

主に以下を参照
https://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

  1. Model(通常は親)で"accepts_nested_attributes_for :(モデル名)"を宣言
class Member < ActiveRecord::Base
  has_one :avatar
  accepts_nested_attributes_for :avatar
end
  1. view(form)を修正して、入れ子になったパラメータが送信されるようにする。
<%= form_with @article do |f| %>
    <%= f.text_field :title %>
    <%= f.text_area :body %>
    <%= f.field_for :categories |g| %>
      <%= g.text_field :name %>
    <% end %>
  <% f.submit %>
<% end %>
  1. controller上でcreate なり、updateなり行う
member = Member.create(params[:member])
member.update params[:member]

注意点

疑問点

  • macro-shareにおいては、子から親を更新しようとしているが、この形はアリなのでしょうか?
    • 一応上の”注意点”の記載から、できそうだなぁという気はしています。
  • accepts_nested_attributes_forはどういった点が問題視されて、今後使われなくなりそうなのでしょうか?

@ms2sato
Copy link
Collaborator Author

ms2sato commented Nov 6, 2018

@jonakp 詳細な調査をありがとうございます。 機能自体の理解は十分そうですね。

使い方について概ねOKです。一つ注意点としては、StrongParameterに飛んでくる子の引数も入れなければならないのでこの辺り気をつけると良いと思います。

疑問点について

macro-shareにおいては、子から親を更新しようとしているが、この形はアリなのでしょうか?

この場合、formの作り方を工夫すると良いですよ。コントローラ名は確かに扱うモデルについて記述するものではありますが、特に中身について限定はしないものと考えると良いです。

userを親、userfeatureを子としてformを作成し、それをUserFeatureController#update で受け取るのは特に問題ありません。こう書くとRailsらしい整ったコードになるでしょう。

accepts_nested_attributes_forはどういった点が問題視

これについては、以下が大きな理由です。プロジェクトオーナーがそう表明しているので、今後非推奨になるでしょう。

DHH氏が無くしたいと発言している

DHH氏がどのように考えて元の発言をしたのかは定かではありませんが、少なくとも彼がそう発信したこと自体には意味があるという考え方で良いと思います。

私個人はこの機能は忌み嫌うレベルのものではありません。むしろコスト削減には良い機能だなと思ってもいます。FormObjectなどで代替できる、ということは背景にあるかもしれません。

@ms2sato
Copy link
Collaborator Author

ms2sato commented Nov 6, 2018

理解としてはOKそうなのでCloseします。疑問があれば引き続きこの続きでコミュニケーションOKです!

@ms2sato ms2sato closed this as completed Nov 6, 2018
@jonakp
Copy link
Owner

jonakp commented Nov 6, 2018

コメントありがとうございます。
疑問点は解消しました。

userを親、userfeatureを子としてformを作成し、それをUserFeatureController#update で受け取るのは特に問題ありません。こう書くとRailsらしい整ったコードになるでしょう。

この内容はaccept_nested_attributes_for も含めて、
Issue #16 で対応する、というつもりでいます!

@ms2sato
Copy link
Collaborator Author

ms2sato commented Nov 7, 2018

@jonakp #16 の意識はこちらでバッチリです。適度なタイミングでやりましょう!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants