底部的更新代码
我正在通过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教程书,看看我是否在完成它时无法弄明白。因为我计划下次做(我计划稍后合并两个应用程序),现在看来是时候了。
答案 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
方法。