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

时间:2017-10-11 20:48:53

标签: ruby-on-rails controller routes ruby-on-rails-5

我正在使用Rails 5.我想构建一个表单

的URL
/my_objects/city_code

我希望它链接到我的控制器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)

1 个答案:

答案 0 :(得分:0)

您必须拥有 config / routes.rb

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

然后在 show action 中的 my_objects_controller.rb 中将 params [:code] 传递给模型:

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) 

这可能会导致问题。如果不是问题,它是一种重复和坏的小代码。