私は比較的新しいレールで、最終的にはaccepts_nested_attributes_for
を使用する正しい方法を見つけました。accepts_nested_attributes_forの代わりに - maybe virtus
しかし、を使用することは一般的に悪いことです(このようなone)。 accepts_nested_attributes_for
を回避するために必要であり、そのフォルダ内に追加のクラスファイルを(私は1つの追加のクラスを必要と推測)入れてしまうでしょうどのような変更
。
私はそれにはvirtusが適切であると読んでいます。そうですか?
モデル
class Person < ActiveRecord::Base
has_many :phones
accepts_nested_attributes_for :phones
end
class Phone < ActiveRecord::Base
belongs_to :person
end
コントローラ
class PeopleController < ApplicationController
def new
@person = Person.new
@person.phones.new
end
def create
@person = Person.new(person_params)
@person.save
redirect_to people_path
end
def index
@people = Person.all
end
private
def person_params
params.require(:person).permit(:name, phones_attributes: [ :id, :number ])
end
end
ビュー(人/:ここ
はまだaccepts_nested_attributes_for
を使用して、非常に基本的な例(完全な例hereを見つける。)でありますnew.html.erb)
<%= form_for @person, do |f| %>
<p>
<%= f.label :name %><br />
<%= f.text_field :name %>
</p>
<%= f.fields_for :phones do |builder| %>
<p>
<%= builder.label :number %><br />
<%= builder.text_field :number %>
</p>
<% end %>
<%= f.submit %>
<% end %>
[編集]
は、サービスオブジェクトを使用することをお勧めでしょうか?
私はあなたの議論を非常によく理解しており、私があなたが記述した状況の下でそれをサポートします。私はプロの開発者ではなく、ホビービストなので、コードの優雅さに気を取る余裕があります。私は、リンクされた記事の著者は、oop-paradigmsに続いて、すべてのオブジェクトが独自のデータを読み書きする必要があると主張していると思います。 accepts_nested_attributes_forでは、一方のオブジェクトは他のオブジェクトデータを変更します。 – speendo
ベストパターンを選ぶことで、長期的にはより多くの時間を節約できます。多くの異なる懸念と責任であなたのモデルを汚染することは後で頭痛を与えるだけです。フォームオブジェクトの使用は、ネストされた属性を使用するよりもはるかに良い方法です。キーは「適切な場所」です。ネストされた属性を使用する方が良い解決策である状況があります。 –
また、なぜ非難は少し極端かもしれませんが、私はまだ、新しい開発者(speendo)に "Railsのやり方"の選択肢を試してみる方が良いと思います。最近、Railsが膨大なアプリケーションでスケールされない(コードベースであり、アプリケーション自体ではない)ことを実感した後、多くの人がフォームオブジェクトなどのものを使い始めたようです。人々がこれをやめないようにすることは、傷つけるだけです.Railsは、フレームワークとして前進し、成熟するより難しい時間を持つでしょう。 –