AJAX渲染弄乱了我的路线

时间:2012-07-01 06:40:23

标签: ruby-on-rails ajax ruby-on-rails-3 routes

我有两个控制器杂志和文章,文章是杂志的嵌套路线。当我在/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来自文章控制器。关于如何发生这种情况的更多细节以及绕过它的清洁解决方案将非常感激。非常感谢!

1 个答案:

答案 0 :(得分: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| %>

希望这有帮助。