我有什么:
路线:
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>
答案 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
或其他什么?你可能会在这个过程中学到一些东西,你的配置看起来很好,之前我曾经遇到过这种类冲突,所以这就是我推荐的地方