我无法弄清楚为什么会收到此错误。我知道这个问题与this question非常相似,但是我所有的jquery链接都是正确的,因为我可以删除没有问题但没有微博的用户。当我在浏览器中尝试该示例并单击微博上的删除链接(http://localhost:3000/microposts/253)时,即使项目确实被删除,浏览器也会说:
Routing Error
No route matches [GET] "/microposts/253"
Try running rake routes for more information on available routes.
测试结果:
Micropost pages micropost destruction as correct user should delete a micropost
Failure/Error: expect { click_link "delete" }.should change(Micropost, :count).by(-1)
ActionController::RoutingError:
No route matches [GET] "/microposts/1"
的routes.rb
resources :users
resources :sessions, only: [:new, :create, :destroy]
resources :microposts, only: [:create, :destroy]
match '/signup', to: 'users#new'
match '/signin', to: 'sessions#new'
match '/signout', to: 'sessions#destroy', via: :delete
match '/help', to: 'static_pages#help'
match '/about', to: 'static_pages#about'
match '/contact', to: 'static_pages#contact'
root to: 'static_pages#home'...
Microposts删除链接:
<%= link_to "delete", micropost, method: :delete,
confirm: "You sure?",
title: micropost.content %>
Microposts控制器:
class MicropostsController < ApplicationController
before_filter :signed_in_user, only: [:create, :destroy]
before_filter :correct_user, only: :destroy
def create
@micropost = current_user.microposts.build(params[:micropost])
if @micropost.save
flash[:success] = "Micropost created!"
redirect_to root_path
else
@feed_items = []
render 'static_pages/home'
end
end
def destroy
@micropost.destroy
redirect_back_or root_path
end
private
def correct_user
@micropost = current_user.microposts.find_by_id(params[:id])
redirect_to root_path if @micropost.nil?
end
end
我无法找到3.2教程仓库来比较我的sample_app,但我想我已经按照教程去了。任何帮助表示赞赏。
答案 0 :(得分:1)
是的,问题是您没有更新路线。在routes.rb文件中,您有resources :microposts, only: [:create, :destroy]
。它寻找的路线是:show to:microposts。
在没有看到您的控制器代码的情况下,我怀疑在您删除微博之后,您正试图重定向回到微博。请更新您的路线:resources :microposts, only: [:create, :destroy, :show]
或张贴您的微博控制器的详细信息。
答案 1 :(得分:0)
我可以看到问题是你的删除请求是'GET',但是根据REST转换它应该是'POST'请求,
我刚刚使用Rails 3.1.3创建了一个示例应用程序,其删除链接如下
在这种情况下,我创建了一个名为User
的脚手架<%= link_to 'Destroy', user, :confirm => 'Are you sure?', :method => :delete %>
您可以使用Firebug with Firefox
检查删除请求的执行情况答案 2 :(得分:0)
我正在完成相同的教程,并遇到同样的问题。我的分析是问题是因为我们在微博控制器中使用redirect_back_or root_path
(〜/ rails_projects / sample_app / app / controllers / microposts_controller.rb):
class MicropostsController < ApplicationController
...
before_filter :correct_user, only: :destroy
...
def destroy
@micropost.destroy
logger.debug "in MicropostsController.destroy:"
logger.debug " root_path=#{root_path}"
logger.debug " session[:return_to]=#{session[:return_to]}"
redirect_back_or root_path
end
显示的logger.debug语句的输出是:
in MicropostsController.destroy:
root_path=/
session[:return_to]=/microposts/28
回想一下,redirect_back_or在sessions_helper.rb中定义为:
def redirect_back_or(default)
redirect_to(session[:return_to] || default)
clear_return_to
end
因此,对redirect_back_or root_path
的调用将导致:
redirect_to(/microposts/28)
我是新手,但我认为默认操作是GET;至少,这与我所看到的一致,即这就是我们向/ microposts / 28发布GET的原因。
同时,在routes.rb中,我们已将资源微博定义为仅支持创建和销毁操作:
resources :microposts, only: [:create, :destroy]
当然,我们不想获取刚刚删除的微博;我们想重新渲染(或重定向?)回到我们来的页面。作为该分析正确的证据,我发现调用redirect_to root_path
而不是redirect_back_or root_path
“工作”,因为微博被删除(弹出确认后),并将用户退回在主页上(显示删除的微博消失了)。
我现在更改了我的内容,以便调用删除操作的页面重新显示:
def destroy
@micropost.destroy
redirect_to request.referer
end
我也更改了SessionsHelper#store_location
的定义:
def store_location
session[:return_to] = request.fullpath if ['show', 'edit'].include?action_name
end
因此,只有“显示”和“编辑”操作会在登录后尝试恢复。
答案 3 :(得分:0)
我遇到了同样的问题,在重新启动Rails服务器之后,它对我来说工作正常。 [发布是否有人最近访问该页面]