如何在Rails 5中构建动态路由?

问题描述:

我使用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) 

你必须在你的的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