2010-12-09 215 views
2

我有另一个红宝石nuby时刻,似乎无法包裹我的头围绕这个简单的问题。简单的导轨路由问题

我有这样的路线:

resources :pages 

我有这个在我的网页控制器:

def testy 

end 

,我有这个在app /视图/页/ testy.html.erb

<h1>Testy</h1> 

我试图访问该页面,如下所示:http://localhost:3000/pages/testy

而且我得到以下错误:

Couldn't find Page with ID=testy 

这里是日志:

Started GET "/pages/testy" for 127.0.0.1 at Thu Dec 09 14:24:51 -0600 2010 
Processing by PagesController#show as HTML 
Parameters: {"id"=>"testy"} 
[1m[35mPage Load (0.3ms)[0m SELECT "pages".* FROM "pages" WHERE ("pages"."id" = 0) LIMIT 1 
Completed in 12ms 

ActiveRecord::RecordNotFound (Couldn't find Page with ID=testy): 
app/controllers/pages_controller.rb:11:in `show' 

它是由日志明显,它试图访问#show,但是为什么呢?我认为这是我的路线问题。有人能给我一个快速指针吗?

我正在关注Rails Guides here,我认为这是抛弃我的原因“......规则是,如果您没有在控制器操作结束时显式呈现某些内容,则rails会查找action_name.html在控制器.erb模板在你的路由查看路径,然后渲染,...”

+0

的可能重复[创建新的轨道的行动不起作用?](http://stackoverflow.com/questions/4312477/creating-new -rails-action-doesnt-work) – 2010-12-09 20:56:53

回答

5

当您在URL pages/后成立的一个RESTful路线像resources :pages,默认情况下任何东西放入params哈希表作为一个ID,因此pages/1会给你params散列,包括{:id => '1'}(尤其像:controller:action等)。

对于诸如pages/newpages/edit之类的某些操作有例外。 Rails很聪明,知道'new'和'edit'不是ID。你只需要告诉rails'testy'也不是一个ID。

可以使用membercollection连接到resources这样一个块中定义自定义操作:

resources :pages do 
    collection do 
    get :testy # will match pages/testy 
    get :foo 
    post :bar 
    end 

    member do 
    get :baz # will match pages/1/baz 
    end 
end 

现在Rails会知道pages/testy是一个定制的路线,不会解释“暴躁”作为ID。确保您的路线名称不会与您的ID相同。换句话说,如果你有一个Page由于某种原因有一个testy的ID,根据上述路线你永远无法达到!

对于较深的造诣,我强烈推荐航线上正式导轨导向: http://guides.rubyonrails.org/routing.html

长类,但绝对值得阅读的时间。

+0

收藏工作(会员没有),非常感谢! – jyoseph 2010-12-10 02:04:12

+0

@jyoseph很高兴帮助。我更新了使用`collection`的答案。 – bowsersenior 2010-12-10 02:07:45

1

文件

resources :pages do 
    get 'test' 
end 

,将工作。必要时替换为帖子

0

由于网页是网址后的任何资源,它将在网址中为id及股票期权。

如果你想有一个定义,“暴躁”作为名称,你需要添加一个named routedroutes.rb如:

map.test 'testy', :controller => "pages", :action => "test" 

然后链接到这一点,你需要调用<%= link_to "testy", testy_path %>

2

选项1

resources :pages do 
    collection do 
     get :testy 
    end 
    end 

结果:

testy_pages GET /pages/testy(.:format) {:action=>"testy", :controller=>"pages"} 

选项2

resources :pages do 
    member do 
     get :testy 
    end 
    end 

结果:

testy_page GET /pages/:id/testy(.:format) {:action=>"testy", :controller=>"pages"} 

选项3个

resources :pages do 
    get :testy 
    end 

结果:

page_testy GET /pages/:page_id/testy(.:format) {:action=>"testy", :controller=>"pages"} 

但我认为选择1是你问的是什么所有的这些可能是有用的。

1

不要忘了运行rake routes或编写路由测试/规格