在POST上RoR“No Route Matches”

时间:2012-12-05 19:26:38

标签: ruby-on-rails ruby-on-rails-3 jquery

我有什么:

路线:

resources :tests do
  resources :resultsets, :only => [:create, :destroy]
  resources :testresults, :only => [:edit, :update] do
    resources :testnotes, :only => [:create, :update, :destroy]
  end
end

提交的表格:(无其他变量)

<%= form_for [@session, @testresult, @testnote], :remote => true do |f| %>
  <%= f.text_field :line %>
<% end %>

@session是测试 @testresult是一个测试结果 @testnote = Testnote.new

控制器操作:

def create
  @testresult = Testresult.find(params[:testresult_id])
  @testnote = Testnote.find_or_create_by_line(params[:testnote][:line])
  @connection = Testnoteconnection.find_or_initialize_by_testnote_id_and_testresult_id(@testnote.id, @testresult.id)

  respond_to do |format|
    if @connection.new_record? and @connection.save
      format.js
    else
      format.js { render :partial => 'error' }
    end
  end
end

def update
  @testresult = Testresult.find(params[:testresult_id])
  @testnote = Testnote.find(params[:id])
  @connection = Testnoteconnection.find_or_initialize_by_testnote_id_and_testresult_id(@testnote.id, @testresult.id)

  respond_to do |format|
    if @connection.new_record? and @connection.save
      format.js
    else
      format.js { render :partial => 'error' }
    end
  end
end

错误是什么:

一切,但回应,工作正常。数据库正常工作,正在创建条目。但是浏览器抛出了以下错误:

No route matches {:action=>"update", :controller=>"testnotes", :test_id=>nil, :testresult_id=>#<Testresult id: 13, resultset_id: 4, testobjecttype_id: 114, testtype_id: 1, result: nil, randomed_order: 0, created_at: "2012-11-28 16:22:49", updated_at: "2012-11-28 16:22:49">, :id=>#<Testnote id: 10, line: "asdf", created_at: "2012-12-05 16:06:17", updated_at: "2012-12-05 16:06:17">}

我的想法:

简短:我绝对不知道!
显然路由很好,否则服务器甚至不会到达控制器操作并执行这些数据库条目。但是什么是创建第二个路由请求?为什么没有正确呈现响应?

修改 表单正确提交并正确路由到create操作,该操作也被正确调用。一切都有效,直到format.js。问题可能在视图中吗?

编辑2 :(查看和部分)

Create.js

$('#notes_drop').closest('tr').before('<%= j render :partial => "testnotes/testnote", :locals => {:note => @testnote} %>');

testnotes / testnote partial

<tr id='comment_<%= dom_id(note) %>'>
  <td>
    <%= note.line %>
  </td>
  <td>
    <%= link_to 'delete', test_testresult_testnote_path(@session, @testresult, note), :method => :delete, :remote => true %>
  </td>
</tr>

2 个答案:

答案 0 :(得分:2)

更新:您的视图包含该行 test_testresult_testnote_path(@session, @testresult, note)

由于@session为零,因此Rails路由器无法弄清楚如何生成test_testresult_testnote_path

以下原始答案。

我的猜测是你的format.js视图代码包含试图找到特定路线的代码。也许你的js视图代码试图将表单部分呈现?

无论如何,如果你看一下

No route matches {:action=>"update", :controller=>"testnotes", :test_id=>nil, :testresult_id=>#<Testresult id: 13, resultset_id: 4, testobjecttype_id: 114, testtype_id: 1, result: nil, randomed_order: 0, created_at: "2012-11-28 16:22:49", updated_at: "2012-11-28 16:22:49">, :id=>#<Testnote id: 10, line: "asdf", created_at: "2012-12-05 16:06:17", updated_at: "2012-12-05 16:06:17">}

您会注意到:test_id =>nil,这意味着您没有传递Test实例进行路由。由于您的:testnotes被定义为嵌套在:testresults下的嵌套资源,它嵌套在:tests下,因此您必须传递一个非零的TestResult和Test实例才能生成路由正确。

您是否在before_filter中实例化@session变量?如果没有,请尝试在更新操作中实例化@session,看看是否能解决您的问题。

答案 1 :(得分:1)

这是一个高度推测性的答案,因为我没有在这里设置环境来测试(双关语)。

我的赌注是与关键字Test发生一些类/命名空间冲突。我知道这有点痛苦,但您是否尝试将其更改为Testo或其他什么?你可能会在这个过程中学到一些东西,你的配置看起来很好,之前我曾经遇到过这种类冲突,所以这就是我推荐的地方