1 か月以上前から、Rails 4 のフォーム オブジェクトの秘密を探ろうとしています。
virtusを使用して、非常に単純なフォームを作成することができます。accepts_nested_attributes_for
ただし、 (モデル内) とfields_for
(フォーム ビュー内)を置き換えるフォーム オブジェクトの開発に失敗しました。
この質問では、小さな電話帳の例について説明します。このフォームでは、人の名前と 3 つの電話番号を一度に入力できます (コード全体をここで見つけてください)。
今度は、フォーム オブジェクトで同じことをしようとしています。私はこれまでに得ます:
# forms/person_form_new.rb
class PersonFormNew
class PhoneFormNew
include Virtus
include ActiveModel::Model
attr_reader :phone
attribute :phone_number, String
end
include Virtus
include ActiveModel::Model
attr_reader :person
attribute :person_name, String
attribute :phone, PhoneFormNew
def persisted?
false
end
def save
if valid?
persist
true
else
false
end
end
private
def persist
@person = Person.create(name: person_name)
@person.phones.build(:phone)
end
end
# views/people/new.html.erb
<h1>New Person</h1>
<%= form_for @person_form, url: people_path do |f| %>
<p>
<%= f.label :person_name %> </ br>
<%= f.text_field :person_name %>
</p>
<p>
<%= f.fields_for :phone do |f_pho| %>
<%= f_pho.label :phone_number %> </ br>
<%= f_pho.text_field :phone_number %>
<% end %>
<p>
<%= f.submit %>
</p>
<% end %>
これは私にエラーを与えます
:phone:Symbol の未定義のメソッド `stringify_keys'
ライン:@person.phones.build(:phone)
残念ながら、これが唯一のエラーではありません。
フォーム オブジェクトで 1 対多の割り当てを実現する方法を教えてもらえますか (Virtus を使用するのが望ましい)。