0

私は 2 つのコントローラーの雑誌と記事を持っています。記事は雑誌のネストされたルートです。私がいるとき/magazines/show、記事を作成するための基本的なフォームがあります

<%= form_for @article, :url => magazine_articles_path(@magazine), remote: true do |f| %>
    <%= render 'shared/error_messages', target: @article %>
    <%= f.text_field :name %>
    <%= f.submit %>
<% end %>

これが送信されると、記事コントローラーに送信されます。記事コントローラーで、このフォームを再レンダリングするアクションをレンダリングします (エラーがあればそれを取り除くためにフォームを再レンダリングしています)

$('#id').html('<%= escape_javascript render partial: 'create_article' %>');

ただし、これにより、フォームのアクションが/magazines/:id/articles代わりに変更されます/magazines/:id

初期フォーム:

<form id="new_article" class="new_article" method="post" data-remote="true" action="/magazines/1/articles" accept-charset="UTF-8">

再レンダリング後のフォーム:

<form id="edit_article_3" class="edit_article" method="post" data-remote="true" action="/magazines/1/articles" accept-charset="UTF-8">

これによりルーティングが台無しになり、このフォームを再度送信しようとするとルーティング エラーが発生します。@articlenewが article コントローラーから来ているので、これが起こっていると思います。これがどのように発生するかについてもう少し詳しく説明し、それを回避するためのクリーンなソリューションを提供していただければ幸いです。本当にありがとう!

4

1 に答える 1

1

ハ!2 番目のケースでは、@article既に存在し、フォームは次のようになります。

<%= form_for @article, :url => magazine_articles_path(@magazine, @article), remote: true do |f| %>

さらに説明すると、 が存在するため、どちらが編集されて@articleいるかを明確にする必要があります。@article記事がまだ存在しない場合は、新しい記事を作成するだけです。

パスヘルパーが新しいレコードと既存のレコード自体を処理できる可能性があります。そうでない場合は、次のようなことを行う必要があります

<% post_url = @article.new_record? ? magazine_articles_path(@magazine) : magazine_articles_path(@magazine, @article) %>
<%= form_for @article, :url => post_url, remote: true do |f| %>

お役に立てれば。

于 2012-07-03T17:17:31.747 に答える