0

是)我有的:

路线:

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. 问题可能出在视图中吗?

Edit2:(查看和部分)

创建.js

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

测试笔记/测试笔记部分

<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>
4

2 回答 2

2

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

由于@session是 nil,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 的非 nil 实例才能正确生成路由。

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

于 2012-12-05T20:01:28.413 回答
1

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

我敢打赌,与关键字的类/命名空间冲突Test。我知道这有点痛苦,但你有没有试过把它Testo改成什么?你可能会在这个过程中学到一些东西,你的配置看起来不错,我之前也有过这种类冲突,所以这就是我的推荐来源

于 2012-12-05T19:48:31.787 回答