Rails3使用ajax路由错误

时间:2010-11-07 21:31:29

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

底部的更新代码

我正在通过Simply Rails 2书创建一个故事投票应用程序。当我点击按钮投票时,我收到此错误:

No route matches "/stories/4-pure-css-icons-showcase"

我的路由文件如下所示:

Shovell::Application.routes.draw do
  get "votes/create"

  root :to => "stories#index"
  resources :stories do
    resources :votes
  end
end

votes_controller.rb:

class VotesController < ApplicationController
  def create
    @story = Story.find(params[:story_id])
    @story.votes.create
  end

end

create.rsj:

page.replace_html 'vote_score', "Score: #{@story.votes.size}"
page[:vote_score].visual_effect :highlight

show.html.erb:

<h2>
    <span id="vote_score">
        Score: <%= @story.votes.size %>
    </span>
    <%= @story.name %>
</h2>
<p>
    <%= link_to @story.link, @story.link %>
</p>
<div id="vote_form">
    <%= form_tag :url => story_votes_path(@story), :remote => true do %>
        <%= submit_tag 'shove it' %>
    <% end %>
</div>

story.rb:

class Story < ActiveRecord::Base
    validates_presence_of :name, :link
    has_many :votes
    def to_param
        "#{id}-#{name.gsub(/\W/, '-').downcase}"
    end
end

在使用已弃用的代码之前,我一直在处理其他一些错误,所以我觉得此刻有点迷失。它似乎应该只是一个路由问题,但由于我一直在处理与投票功能有关的AJAX错误,我想发布这些文件以防万一它不仅仅是路由。

它说没有路由与"/stories/4-pure-css-icons-showcase"匹配,但是当我访问"/stories"(我的根)并点击链接转到"/stories/4-pure-css-icons-showcase"时,它工作正常,但点击投票后按钮我收到此错误。正如您在阅读代码后可能知道的那样,假设更新投票计数并通过ajax执行:highlight


更新

更改了代码(所有更改均符合Sam的建议):

路线:

Shovell::Application.routes.draw do
  resources :votes
  root :to => "stories#index"
  resources :stories do
    resources :votes
  end

show.html.erb:

<div id="vote_form">
    <%= form_tag :url => new_story_vote_path(@story), :remote => true do %>
        <%= submit_tag 'shove it' %>
    <% end %>
</div>

votes_controller.rb

class VotesController < ApplicationController
  def create
    @story = Story.find(params[:story_id])
    @story.votes.create
    respond_to do |format|
        format.html
        format.js 
  end
end

问题仍然完全一样,但我认为(读:希望)我们正在取得进展!

方案:我的索引(/stories)页面随机显示数据库中的故事,当您单击链接时,它会将您带到故事的内部页面(例如{{1在这个页面上它显示了故事的投票数量,并有一个投票的按钮。当您单击投票按钮时,假设使用ajax更新/stories/2-sitepoint-forums并使用@story.vote.size视觉效果。但问题是,当您单击投票按钮时,页面将更改为“路由错误”页面,其中显示:

:highlight

对我来说很奇怪,因为你实际上可以路由到那个地址而你是来自第一页上的链接......


以下是控制台中的错误:

No route matches "/stories/2-sitepoint-forums"

我不确定这是否更具说服力,但我想我会加入它。

<小时/> 我还没能解决这个问题。因为我仍然不觉得我完全理解这个问题,所以我决定在网上转到Ruby on Rails 3教程书,看看我是否在完成它时无法弄明白。因为我计划下次做(我计划稍后合并两个应用程序),现在看来是时候了。

3 个答案:

答案 0 :(得分:2)

<%= form_tag :url => new_story_vote_path(@story), :remote => true do %>
    <%= submit_tag 'shove it' %>
<% end %>

那应该将它发送到创建动作。

def create
  @story = Story.find(params[:story_id])
  @story.votes.create
  respond_to do |format|
      format.html
      format.js 
  end 
end

这应该照顾你的ajax。


从你的路线中取出get "votes/create"

并添加此

map.resources :votes

答案 1 :(得分:0)

我不熟悉使用form_tag和:remote(因为我通常只是为这样的东西编写jQuery)但是我在这里做的一些事情肯定会突然出现,可能有助于你解决问题

首先,我认为您可以按照设置投票的方式进行修改,从而设置表单进行投票。在故事控制器中,对于节目动作,我立即设置了投票:

@vote = Vote.new(:story_id => @story.id)

这使您可以将表单设置为:

= form_for(@vote), :remote => true do |f|
    = hidden_field f.story_id
    = submit_tag "Vote"

在我看来,这既是一种更干净的做事方式,也可以解决您正在处理的一般问题,因为您现在传递数据与表单(隐藏字段)在你的POST请求中。如果您执行不实际提交数据的AJAX POST请求,Rails将出现意外行为。

换句话说,您的原始表单可能作为AJAX POST请求运行,但它作为AJAX GET请求会更好,因为它实际上并没有提交数据,它只是“点击”一个URL。

答案 2 :(得分:0)

我不确定您是否找到了问题的答案,但我想发布其他人可能正在寻找与您类似的答案。

代码:

<%= form_tag :url => new_story_vote_path(@story), :remote => true do %>
    <%= submit_tag 'shove it' %>
<% end %>

将使用:post请求导致/ stories /:story_id / votes / new url。它不起作用,因为new路由是:get方法请求。如果你想转到new方法,你需要告诉表单使用get http方法。

<%= form_tag :url => new_story_vote_path(@story), :remote => true, :html => { :method => :get } do %>
    <%= submit_tag 'shove it' %>
<% end %>

但是,我认为您希望路由到控制器中的create方法。我会做类似的事情:

<%= form_tag :url => story_votes_path(@story), :remote => true do %>
    <%= submit_tag 'shove it' %>
<% end %>

这应该正确地路由到VotesController中的create方法。