0

我有两个控制器杂志和文章,文章是杂志的嵌套路线。当我在/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">

如果我再次尝试提交此表单,这会打乱我的路由并给我带来路由错误。我猜这是因为新@article的来自文章控制器。非常感谢有关这种情况如何发生的更多细节以及解决此问题的干净解决方案。非常感谢!

4

1 回答 1

1

哈!在第二种情况下,您@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 回答