2

私は、ユーザーがゴール、それらのゴールのマイルストーン、マイルストーンのタスク、ゴール自体のタスクを保存できるアプリケーションを作ろうとしています。私はポリモーフィックな関連付けを使用していますが、それらのすべてを入力するフォームを作成することは困難であることが証明されています。問題は、マイルストーンがまったく節約されていないことと、マイルストーンタスクが「マイルストーン」タイプではなく「ゴール」タイプのデータベースとしてリストされていることです。モデルとデータベースはthe top answer for this questionのように設定されています。 私は誰かが私のform_forの実装を見て、それが正しいかどうか、または問題がどこかにあるかどうかを見てみることを望んでいます。あなたが他のコードを見る必要があるかどうかを教えてください。ネストされた属性がポリモーフィックな関連付けを持つフォームに保存されない

<%= nested_form_for @goal do |f| %> 

    <%= render 'shared/error_messages', :object => f.object %> 
    <%= render 'shared/goal_fields', :f => f %> 

    <%= f.fields_for :milestones do |ff| %> 
    <%= render 'shared/milestone_fields', :f => ff %> 
    <% end %> 

    <%= f.fields_for :tasks do |ff| %> 
    <%= render 'shared/task_fields', :f => ff %> 
    <% end %> 

    <%= f.link_to_add "Add Milestone", :milestones %> 
    <%= f.link_to_add "Add Task", :tasks %> 
    <%= f.submit %> 

<% end %> 

答えて

1

Railsフォームビルダメソッドfields_forを使用すると、複数のレコードの属性をネストできます。コードのこの部分は正しいと見なされます(部分的な部分が機能していると仮定します)。あなたは、次のようにゴールオブジェクトのオフの関係を構築することにより、あなたのfields_forラインをより明確にすることができます。

<%= f.fields_for :milestones, @goal.milestones.build do |ff| %> 
    <%= render 'shared/milestone_fields', :f => ff %> 
<% end %> 

あなたのモデルは、これらのモデルのそれぞれに渡されるパラメータを処理するために、次のコードを持っていることを確認してください:

# app/models/goal.rb 
has_many :milestones 
has_many :tasks 
accepts_nested_attributes_for :milestones 
accepts_nested_attributes_for :tasks 

# app/models/milestone.rb 
has_many :tasks 
accepts_nested_attributes_for :tasks # For tasks on milestones 

また、あなたがロックダウンするattr_accessible使用している場合は、あなたのモデルがこれらのエントリは、対応するエントリ(milestones_attributes、tasks_attributes、など)を持っていること、大量の割り当てから属性ていることを確認し

Whをフォームを送信し、レール開発ログを見て、パラメータが以下のような形式で表示されることを確認してください:

{:goal => {:milestones_attributes => {{tasks_attributes => {}、 :tasks_attributes => {}}}

このデータはすべて処理されていますが、レコードがまだ保存されていない場合は、レコードが有効でないことを示す可能性のある「ROLLBACK」エントリがログに記録されています挿入されません。 nested_attributes上

詳細情報はここで見つけることができます。これらのネストされた属性を利用フォームヘルパーの http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

情報はここで見つけることができます: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for

+1

あなただけ'@goal.milestonesを使用したいと思います.build'を新しいアクションに追加し、「空の」マイルストーンフォームが必要な場合は、このコードはコントローラーのほうが優れています。 –

+0

私は修正した質量割り当て問題を持っていました。また、@ goal.milestones.buildと@ goal.tasks.buildをフォームに追加しました。その後、私はすべてを保存することができましたが、フォームを編集しようとすると、目標データは表示されません(新しいフォームのように見えます)。私は、これがいかに困難になっているかという理由だけで何か間違っている気がします。 –

関連する問題