如何在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)
这可能会导致一个问题。如果不是问题,它是一种重复和糟糕的小代码。
我已经有了my_objects的资源块,所以我尝试将代码的修改版本“get':code'添加到:'#search_by_code'”,但是出现错误。请参阅我的编辑。我可能没有适当地运用你的逻辑。 – Dave
@Dave这是正确的方法。请修复您的代码并让我知道。 get':code',to:'my_objects#search_by_code' – vitulicny
你在说我应该从“collections do”方法中删除所有的行,并将它们作为单个行放入文件中。从“收集做”块拆分出“发布”创建'“? – Dave