2017-10-11 87 views
0

我使用Rails 5.我想構建形式如何在Rails 5中構建動態路由?

/my_objects/city_code 

的URL,我想它鏈接到我的控制器,my_objects_controller.rb,特別是這種方法

def search_by_code 
    ... 
    end 

然後在這個方法中,我想能夠提取「city_code」作爲變量。我不知道如何做到這一點的路線。我該如何解決這個問題?

編輯:我嘗試添加到現有的塊我已經有了你的路線......

resources :my_objects do 
    collection do 
     post 'create' 
     get 'import' 
     get '/index', to: redirect('/races/index') 
     get 'search' 
     get 'stats' 
     get ':code', to: '#search_by_code' 
    end 
    end 

,但它導致了下面的錯誤,當我開始我的應用程序...

/Users/davea/.rvm/gems/ruby-2.4.0/gems/actionpack-5.0.3/lib/action_dispatch/routing/mapper.rb:314:in `block (2 levels) in check_controller_and_action': '' is not a supported controller name. This can lead to potential routing problems. See http://guides.rubyonrails.org/routing.html#specifying-a-controller-to-use (ArgumentError) 

回答

0

你必須在你的的config/routes.rb中

get '/my_objects/:code', to: 'my_objects#show' 

然後在show動作你my_objects_controller.rb通過PARAMS [:代碼]到模型:

MyObject.search_by_code(params[:code]) 

my_object.rb型號:

def self.search_by_code(code) 
    MyObject.where(code: code) 
end 

修復根據問題編輯:

固定的routes.rb:

resources :my_objects do 
    collection do 
     post 'create' 
     get 'import' 
     get '/index', to: redirect('/races/index') 
     get 'search' 
     get 'stats' 
     get ':code', to: 'my_objects#search_by_code' 
    end 
    end 

運行這從終端:

rake routes 

,它會輸出:

 Prefix Verb URI Pattern     Controller#Action 
     my_objects POST /my_objects/create(.:format) my_objects#create 
import_my_objects GET /my_objects/import(.:format) my_objects#import 
index_my_objects GET /my_objects/index(.:format) redirect(301, /races/index) 
search_my_objects GET /my_objects/search(.:format) my_objects#search 
stats_my_objects GET /my_objects/stats(.:format) my_objects#stats 
        GET /my_objects/:code(.:format) my_objects#search_by_code 
        GET /my_objects(.:format)   my_objects#index 
        POST /my_objects(.:format)   my_objects#create 
    new_my_object GET /my_objects/new(.:format)  my_objects#new 
    edit_my_object GET /my_objects/:id/edit(.:format) my_objects#edit 
     my_object GET /my_objects/:id(.:format)  my_objects#show 
        PATCH /my_objects/:id(.:format)  my_objects#update 
        PUT /my_objects/:id(.:format)  my_objects#update 
        DELETE /my_objects/:id(.:format)  my_objects#destroy 

正如你可以看到你有兩個相同的路徑:

GET /my_objects/:code(.:format) 

GET /my_objects/:id(.:format) 

這可能會導致一個問題。如果不是問題,它是一種重複和糟糕的小代碼。

+0

我已經有了my_objects的資源塊,所以我嘗試將代碼的修改版本「get':code'添加到:'#search_by_code'」,但是出現錯誤。請參閱我的編輯。我可能沒有適當地運用你的邏輯。 – Dave

+0

@Dave這是正確的方法。請修復您的代碼並讓我知道。 get':code',to:'my_objects#search_by_code' – vitulicny

+0

你在說我應該從「collections do」方法中刪除所有的行,並將它們作爲單個行放入文件中。從「收集做」塊拆分出「發佈」創建'「? – Dave