2015-10-09 106 views
1

我使用腳手架創建了CRUD。ActiveRecord RecordNotFound錯誤

rails g scaffold intermediate_level/memory_game 

然後我創建的方法玩,但是當我調用該方法起到返回一個錯誤。 http://localhost:3000/intermediate_level/memory_game/play?id=1

Couldn't find IntermediateLevel::MemoryGame with 'id'=play 
    # Use callbacks to share common setup or constraints between actions. 
    def set_intermediate_level_memory_game 
     @intermediate_level_memory_game = IntermediateLevel::MemoryGame.find(params[:id]) 
    end 

def play { 
     @intermediate_level_memory_game = IntermediateLevel::MemoryGame.find(params[:id]) 
    } 

我routes.file

namespace :intermediate_level do 
    resources :memory_game 
    get 'memory_game/play' 
    end 

回答

1

您的自定義get 'memory_game/play應該來resources :memory_game之前。 Rails按照它們在routes.rb文件中列出的順序來評估路由,最接近文件頂部的路由將獲得最高優先級。

+0

謝謝,正是這樣! –

1

有了您給出的路線信息:

namespace :intermediate_level do 
    resources :memory_game 
    get 'memory_game/play' 
    end 

您有這兩條路線:

GET /intermediate_level/memory_game/:id(.:format)  intermediate_level/memory_game#show 

GET /intermediate_level/memory_game/play(.:format)  intermediate_level/memory_game#play 

當你提出這個要求:

routes.rb文件 resources :memory_game 以前 get 'memory_game/play',所以第一個( GET /intermediate_level/memory_game/:id)進入行動爲具有更高的優先級,( 因爲路由優先:
http://localhost:3000/intermediate_level/memory_game/play?id=1 

,同時由這些路由的匹配,併爲您定義由config/routes.rb文件中的路線出現的順序定義),然後它試圖找到與id param在這種情況下是play,但沒有這樣做(因爲你沒有任何記憶遊戲id=play )並且出現錯誤消息:

Couldn't find IntermediateLevel::MemoryGame with 'id'=play 

一個快速的方法來解決這個問題是重新排列你這樣的路線:

namespace :intermediate_level do 
    get 'memory_game/play' 
    resources :memory_game 
    end 

然後,你請求的URL http://localhost:3000/intermediate_level/memory_game/play?id=1GET /intermediate_level/memory_game/play(.:format) intermediate_level/memory_game#play路線這是你想要的送達。

+1

謝謝,正是這樣!感謝您的好解釋。 –

+0

@ GleydsonS.Tavares歡迎:)很高興它幫助你解決了你的問題。你應該考慮接受一個答案。要了解接受答案的工作原理,請參閱以下文章:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

相關問題