【问题标题】:Rails "No route matches" error when trying to POST via AJAXRails 尝试通过 AJAX 发布时出现“无路由匹配”错误
【发布时间】:2013-09-21 02:35:23
【问题描述】:

我正在构建一个 Rails 应用程序,让用户可以对嵌套的问题和答案进行投票:

此代码按预期工作,让用户投票赞成一个答案:

<%= link_to raw('<i class="icon-2x icon-chevron-up"></i>'), vote_question_answer_path(@question, answer, :type => :up), :method => :post %>

但是这段代码应该通过 ajax 做同样的事情:

<%= link_to raw('<i class="icon-2x icon-chevron-up"></i>'), vote_question_answer_path(@question, answer, :type => :up), :remote => true, :method => :post %>

正确记录投票,但随后出现以下错误:

ActionController::RoutingError at /questions/fugiat-nulla-blue-bottle-raw-denim-fap-sint-butcher-ethical-cosby-sweater-thundercats-distillery-laboris-tofu/answers/6/vote=========================================================================================================================================================================> No route matches {:action=>"vote", :controller=>"answers", :type=>:up, :question_id=>nil, :id=>#<Answer id: 6, body: "Ullamco Pinterest food truck incididunt trust fund,...", user_id: 1, question_id: 10, created_at: "2013-09-10 22:20:40", updated_at: "2013-09-10 22:20:40">}app/views/shared/_vote_answer_arrows.html.erb, line 6

我很困惑 - 这两个帖子不是在同一条路线上吗?为什么一个工作正常,另一个给出路由错误?

我认为问题与嵌套路由有关,因为我的问题代码几乎相同,并且 AJAX 路由在那里工作。

编辑:根据要求,以下是相关路线:

resources :questions do
  member { post :vote }
  resources :answers do
    member { post :vote }
  end
end

而respond_to 做|格式|

respond_to do |format|
  format.html{ redirect_to :back, :flash => { :success => 'Thank you for voting!' }}
  format.js {}
end

这是来自 firebug 的 AJAX 错误消息/URL:

"NetworkError: 500 Internal Server Error - http://localhost:3000/questions/fugiat-nulla-blue-bottle-raw-denim-fap-sint-butcher-ethical-cosby-sweater-thundercats-distillery-laboris-tofu/answers/5/vote?type=down"

这是来自 firebug 的 AJAX 参数(这对我来说看起来很错误,所以我不确定这是问题的根源还是我不熟悉 firebug:

type    down

这是来自服务器输出的成功的非 AJAX 请求参数:

Parameters: {"authenticity_token"=>"X3Dg3TSZ8blMNTT1Zce2R0A1rtZI93ViFJNsjOP145w=", "type"=>"up", "question_id"=>"fugiat-nulla-blue-bottle-raw-denim-fap-sint-butcher-ethical-cosby-sweater-thundercats-distillery-laboris-tofu", "id"=>"3"}

【问题讨论】:

  • 有趣的是,错误消息显示No route matches { ... :question_id=&gt;nil, :id=&gt;#&lt;Answer id: 6,...} ...,因为 1. question_id 为 nil,2. 因为 id 是答案 object。您能否发布您的 routes.rb 文件,rails 服务器输出中的成功请求(当您不使用 ajax 时)参数是什么,以及 ajax 请求的 url 和参数是什么(来自 firebug 或 chrome 开发人员工具)?
  • 感谢您的浏览。我刚刚发布了您要求的信息。特别是 AJAX 参数在我看来是错误的。我今天早上才开始使用 firebug,所以我可能在错误的地方寻找参数。
  • 我刚刚注意到您说 ajax 请求“正确记录了投票,但随后出现以下错误:”所以这意味着 ajax 请求正在正确路由并到达您的控制器操作,并且处理控制器操作后发生的路由错误正在发生。当这个请求完成时你会做什么?我看到您的 respond_to 块中有 format.js{};此请求完成后,您是否在 javascript 中执行任何操作?感谢您发布附加信息,这对排除某些问题非常有帮助。
  • 啊,我明白了——路由错误来自“app/views/shared/_vote_answer_arrows.html.erb,第 6 行”——所以错误是当 rails 试图渲染那个部分,而不是当它试图处理请求时!你在那一行有什么,在那一行使用的变量的值是什么?
  • 您的评论让我找到了解决这个问题的正确方向,非常感谢!在我的控制器中,我没有定义@question。在我将请求转换为 ajax 并需要变量在我的 javascript 中呈现部分内容之前,这不是问题。

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


【解决方案1】:

正如我在上面的 cmets 中提到的,结果证明这是一个简单的控制器问题。

在我的控制器中,我没有定义@question。在我将请求转换为 ajax 并需要变量在我的 javascript 中呈现部分内容之前,这不是问题。

我加了

@question = Question.find(params[:question_id])

到控制器,它解决了问题。

【讨论】:

    【解决方案2】:

    您的控制器中是否有 respond_to do |format| 块?

    你应该有类似...

    respond_to do |format|
      if something_saves or whatever
        format.html { redirect_to random_path, notice: 'Vote was casted.' }
        format.json { render :json => { :voteCasted => true } }
      else
        format.html { render :nothing }
      end
    end
    

    主线是...

    format.json { render :json => { :voteCasted => true } }
    

    目前,您似乎缺少对 JSON 格式的响应。这就是为什么 HTML 版本可以正常工作而 AJAX (JSON) 方法却不行的原因。

    【讨论】:

    • 这与他收到的路由错误无关。相反,它告诉控制器要返回给客户端的内容(html、json 等),如果他一开始就无法访问控制器,这并不重要。
    • 感谢您的帮助。我确实有一条 format.js 行,它适用于非嵌套资源(问题)。我将其添加到原始问题中。
    • 好吧,对不起。谢谢你的澄清。
    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 2016-03-03
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 2012-06-29
    相关资源
    最近更新 更多