ActiveRecord :: RecordNotFound用于对象,明显的路由错误

时间:2013-03-24 00:52:05

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

我是一个Rails新手,我正在努力寻找路由错误。

我有一个Site对象,其中包含有关网站的信息以及如何抓取它。我想测试我的代码与网站的连接。点击我的应用中的“测试网站”会产生错误:

Couldn't find Site without an ID

app/controllers/sites_controller.rb:86:in `test_site'

的routes.rb

...
      post "/test_site" => "sites#test_site" 
      get "home/index"
      resources :sites, :logins
...

index.html.erb

...    
      <% @sites.each do |site| %>
      <tr>
        <td>
            <%= form_tag test_site_path(site) do -%>
            <div><%= submit_tag 'Test site' %></div>
            <% end -%>
...

sites_controller.rb

...
      def test_site
        @site = Site.find(params[:id])
...

看起来Sites控制器没有从test_site_path(站点)获取Site:id。我不确定如何设置路由并正确传递ID。

谢谢!

修改:我尝试将此代码添加到我的routes.rb:

resources :sites do 
  get "/test_site", :action => "test_site", :on => :member 
end 

我收到此错误:

No route matches {:controller=>"sites", :action=>"test_site", :format=>#<Site id: 11, ... 

我可能做错了什么?

1 个答案:

答案 0 :(得分:0)

对于新手来说,我可以告诉你要做的最好的事情就是在添加新功能时编写控制器测试,因为它有助于调试这样的问题。使用restful操作而不是创建自己的操作。尝试使用index,new,edit,create,update,show,destroy。

sites_controller_spec.rb

require 'spec_helper'

describe SitesController do
  let(:site) { Site.create() } #Add to create what a site requires, eventually this will become a fixture but don't worry about that now
  describe "#show" do
   before { get :show, id: site.to_param }
   it "responds with success" do
     response.should be_success
   end
  end
end

运行此测试。它会告诉你没有路线

的routes.rb

  

资源:网站,仅限:%w [show]

运行此测试。它将失败并告诉您创建站点控制器和显示操作:

class SitesController < ApplicationController
  def show
  end
end

再次运行测试。它现在会抱怨,因为没有观点。

  

查看 - &gt;创建目录(网站) - &gt;在里面创建一个文件show.html.erb

再次运行测试。它现在正在过去。您的路由现在正在使用REST正常工作,并且检查它是否正常工作现在已自动完成。

现在看起来似乎有点模仿,但我保证,如果你养成这个习惯,它将成为第二天性,你将不必再次处理路由错误。