1

私の記事には多くの人がいるデータベース構造があります(結合を介して、しかしそれはうまく機能しています)

私が実現したいのは、人々が記事を作成すると同時に新しい人を作成できることです

つまり、パスは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 フォームの問題の解決策は見つかりませんでした。

どうもありがとう。

4

0 に答える 0