我比較新的軌道,並最終找到正確的方式來使用accepts_nested_attributes_for
。accept_nested_attributes_for的替代方案 - 也許德爾
但是,網絡上有一些認爲使用accepts_nested_attributes_for
通常是不好的做法(如one)的嚴重資源。
需要做什麼修改來避免accepts_nested_attributes_for
以及在哪個文件夾中放置額外的類文件(我想我需要一個額外的類)。我知道virtus是適合的。是對的嗎?
這裏仍然使用accepts_nested_attributes_for
一個非常簡單的例子(找到完整的例子here):
模式
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
視圖(人/ 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範式,每個對象應該只能讀寫自己的數據。通過accept_nested_attributes_for,一個對象會改變一些其他的對象數據。 – speendo
從長遠來看,選擇最佳模式將最終爲您節省更多時間。以許多不同的擔憂和責任污染你的模型只會讓你頭痛。在適當的情況下使用Form對象比使用嵌套屬性更好。關鍵是「在適當的地方」 - 有些情況下使用嵌套屬性是更好的解決方案。 –
另外 - 爲什麼貶低可能有點極端,我仍然認爲讓新開發人員(speendo)嘗試替代「Rails方式」更好。最近似乎很多人已經開始使用諸如Form對象之類的東西,因爲在實現Rails不能擴展(代碼庫,而不是應用程序本身)和巨大的應用程序之後。不鼓勵人們這樣做會受到影響,而且Rails將會越來越難以向前推進,併成爲一個框架。 –