2011-04-26 41 views
6

加載默認情況下,現在我有一個新的rails 3安裝運行在rvm 1.9.2 我使用後續指令生成的控制器:的Rails 3 - index動作不是在控制器

rails generate controller blog index 

輸出是

 create app/controllers/blog_controller.rb 
     route get "blog/index" 
     invoke erb 
     create app/views/blog 
     create app/views/blog/index.html.erb 
     invoke test_unit 
     create test/functional/blog_controller_test.rb 
     invoke helper 
     create app/helpers/blog_helper.rb 
     invoke test_unit 
     create  test/unit/helpers/blog_helper_test.rb 

但在瀏覽器中,當我試圖去http://localhost:3000/blog我得到:

No route matches "/blog" 

但如果我鍵入http://localhost:3000/blog/index

它呈現索引視圖。

它不像Rails 2那樣工作嗎?在那裏我只是把控制器的名稱在url上默認的索引視圖?

謝謝。

回答

4

爲Rails 3:

match '/blog', :controller => 'blog', :action => 'index' 
+1

它會看起來像這樣:'match'/ blog'=>'blog#index''你不覺得嗎? – 2013-01-11 16:09:31

2

這是一個猜測,根據我的經驗,使用Rails 2,但這裏是我認爲正在發生的:(?這仍然是在Rails 3中,右)

如果你想生成您的控制器與scaffold選項,它會創建一個模型,除了你的控制器,並通過呼籲map.resources(或Rails 3等效)添加相應的路線 - 這最後一點是什麼給你你期望的/models路線。

但是由於您剛剛生成了控制器,因此沒有創建模型,因此Rails沒有在routes.rb中放入map.resources語句 - 真正只有在控制器底層有模型時纔有意義。事實上,我不認爲它在生成控制器時增加了任何特殊路由;您將通過默認路由之一進入索引:/:controller/:action

所以,如果你想從/blog到你的索引,你必須自己添加路線。幸運的是,它應該是一行一行。

希望這會有所幫助! PS:如果你是偏執的人,你需要在開始生產之前禁用這些默認路由 - 它們允許GET請求觸發更改數據庫的操作(例如GET:/blog/destroy),最多可以打開Cross-Site Request Forgery攻擊。

10

如果你看看routes.rb你會看到

get "/blog/index" => "blog#index" 

所以只是

get "/blog" => "blog#index" 

刪除它,或者你可以在這裏使用resources

但只有問題:你爲什麼使用單數形式?將index設爲singular名詞是無意義的。您應該使用或「博客#顯示」作爲資源或「博客#索引」作爲資源。

Rails中的約定是一種地下室。如果你可以遵循它們,請不要破壞它們

4

默認情況下,Rails生成不會爲您的控制器生成資源。你可以指定你的控制器一個動作,「索引」,所以你的情況你的config/routes.rb中這樣結束​​了:

Blog::Application.routes.draw do 
    get "blog/index" 

做的是最簡單的事情來改變這:

get "blog", :to => 'blog#index' 

ian。

1

將此項添加到您的routes.rb文件中match ':controller(/:action(/:id))(.:format)'
如果您將其添加到routes.rb文件的底部會更好。
這種方法的問題是,它會通過獲取請求使所有操作都可用。所以要小心。

0

代替人工路由的,你可以去/app/controllers/application_controller.rb,並添加一個空白指數法

def index 
end 

確保您的生成器擴展應用控制器,並熱潮所有你生成的控制器做你想做的事
測試Rails 3.2。*