没有路由匹配[GET]“/ microposts / x”第10章,Hartl的Ruby on Rails教程应该是删除链接

时间:2012-02-28 14:26:33

标签: ruby-on-rails

我无法弄清楚为什么会收到此错误。我知道这个问题与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,但我想我已经按照教程去了。任何帮助表示赞赏。

4 个答案:

答案 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服务器之后,它对我来说工作正常。 [发布是否有人最近访问该页面]