jyo*_*eph 2 ruby routes ruby-on-rails
我有另一个红宝石的nuby时刻,似乎无法绕过这个简单的问题.
我有这个路线:
resources :pages
Run Code Online (Sandbox Code Playgroud)
我在我的页面控制器中有这个:
def testy
end
Run Code Online (Sandbox Code Playgroud)
我在app/views/pages/testy.html.erb中有这个
<h1>Testy</h1>
Run Code Online (Sandbox Code Playgroud)
我试图像这样访问页面:http:// localhost:3000/pages/testy
我收到以下错误:
Couldn't find Page with ID=testy
Run Code Online (Sandbox Code Playgroud)
这是日志:
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'
Run Code Online (Sandbox Code Playgroud)
日志显而易见,它正试图访问#show,但为什么呢?我认为这是我的路线问题.有人可以给我一个快速指针吗?
我在这里关注Rails指南,我认为这就是让我失望的原因"......规则是如果你在控制器动作结束时没有明确地呈现某些内容,那么rails会查找action_name.html.erb控制器视图路径中的模板,然后呈现,..."
当您设置一个RESTful路线像resources :pages后,默认情况下,任何pages/在URL放入params哈希表作为一个ID,这样pages/1会给你params散列,包括{:id => '1'}(除其他事项外象:controller,:action等等).
某些行为有例外,例如pages/new或pages/edit.Rails足够聪明,知道"新"和"编辑"不是ID.你只需告诉rails,'testy'也不是一个ID.
您可以使用member或collection在附加的块内定义自定义操作,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
Run Code Online (Sandbox Code Playgroud)
现在rails将知道这pages/testy是一个自定义路由,并不会将'testy'解释为ID.确保您的路线名称永远不会与您的ID相同.换句话说,如果你因某种原因Page而拥有一个id testy,那么在上述路线下你永远无法达到它!
为了更深入的了解,我强烈推荐路线上的官方栏目指南:http: //guides.rubyonrails.org/routing.html
有点长,但绝对值得花时间阅读.
| 归档时间: |
|
| 查看次数: |
1540 次 |
| 最近记录: |