私の記事には多くの人がいるデータベース構造があります(結合を介して、しかしそれはうまく機能しています)
私が実現したいのは、人々が記事を作成すると同時に新しい人を作成できることです
つまり、パスはarticle/new/people/newの形式である必要があります
実際、ネストされたルートを使用せずに、このアプローチを使用してこれを管理しました
article.rb (モデル)
attr_accessor :new_person
article_controller.rb
def create
@article = Article.new(params[:article])
if params[:add_person]
@person = Person.check_if_exists_or_create(@article.new_person["first_name"], @article.new_person["last_name"])
if @person.save
@article.people << @person
@article.new_person = nil
end
render :action => "new" and return
end
...
end
フォーム.erb
<%= form_for @article do |f| %>
...
<%= fields_for :new_person do |p| %>
<% if @person && @person.errors.any? %>
<%= render :partial => "shared/error_messages", :object => @person %>
<% end %>
<div class="field">
<%= p.label :first_name, "First Name" %>
<%= p.text_field :first_name %>
</div>
<div class="field">
<%= p.label :last_name, "Last Name" %>
<%= p.text_field :last_name %>
</div>
<%= submit_tag "Add Person", :name => "add_person" %>
<% end %>
...
<p>
<%= f.submit %>
</p>
<% end %>
これはある程度は問題なく機能しますが、現在、フォームは他のフィールドでより複雑になっています。ネストされたルートを利用するためにリファクタリングできると考えました。
さらに、コントローラーの作成に多くのロジックを追加しています。さらに、これらのアクションをJavaScriptにすることを検討する場合があります。その場合、コントローラーによって押された特定のボタンを判断するのはより複雑です。
これらの理由から、ネストされたルート アプローチがより自然に適合する可能性があると考えました。
既存の記事の場合、問題なく/articles/1/people/newなどで問題なく動作します。
入れ子のフォームは、とりわけhtml検証の理由でノーノーであることを知っているので、form_forとfields_forのさまざまな組み合わせを試して、次の目標を達成しました。
記事/新しいページで
メインフォームを article/new に送信 new_person フィールドを含む「サブ」フォームを article/new/people/new に送信
そして、UJSによるこれへの変更を可能な限り無痛にする
私が得たと思う最も暖かいのは、このエラーでした
No route matches {:controller=>"people", :article_id=>#<Article id: nil, title: nil, published_on: nil, created_at: nil, updated_at: nil, people_count: nil, organizations_count: nil>}
問題は、その時点で人を関連付ける article_id がないことだと推測しています。
しかし、実際には、その人をデータベースに追加して、記事全体が保存されるときに保存される記事へのリレーションシップを作成することに本当に興味があるだけです。
長い投稿で申し訳ありませんが、私の質問で包括的になりたいと思っていました。
私の目的により適した代替アプローチを含むアドバイスをいただければ幸いです。ネストされたフォームとネストされたルートに関連するレールキャストを見て、オンラインで見つけられるものをすべて読みましたが、/model/new/submodel/new フォームの問題の解決策は見つかりませんでした。
どうもありがとう。