2013-03-24 46 views
0

我是一个Rails新手,我挣扎似乎是一个路由错误。ActiveRecord :: RecordNotFound为一个对象,明显的路由错误

我有一个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]) 
... 

看起来站点控制器没有从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, ... 

什么可能我是做错了什么?

+2

我没有看到“post”/ test_site“'带有一个id。无论如何,为什么不[添加RESTful动作](http://guides.rubyonrails。org/routing.html#adding-more-restful-actions)并且不用担心手动定义路由参数?! – 2013-03-24 00:54:26

+0

嗨Dave,我试着用几种方法添加一个RESTful动作,并没有想出如何正确地做到这一点。你介意发布代码来做到这一点? – mjgold 2013-03-24 01:01:21

+0

在站点资源块中添加'get'test_site',:on =>:member'。 – 2013-03-24 01:06:12

回答

0

对于新手来说,我可以告诉您要做的最好的事情是在您添加新功能时进行编写控制器测试的过程,因为它有助于调试此类问题。使用宁静的行为,而不是创建自己的行为。尝试使用索引,新建,编辑,创建,更新,显示,销毁。

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

resources :sites, only: %w[show]

运行这个测试。它会失败,并告诉你创建一个站点控制器和一个显示操作:

class SitesController < ApplicationController 
    def show 
    end 
end 

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

View -> create directory (sites) -> inside create a file show.html.erb

再次运行测试。它现在正在通过。您的路由现在可以正常工作,使用REST并检查它是否正常工作,现在已经实现了自动化。

这看起来似乎有点模仿,但我保证,如果您将此设为习惯,它将成为第二天性,您将不必再次处理错误。

相关问题