让我们从一些代码开始:
Rails.application.routes.draw do
namespace :mpd do
get 'help' #==> get "mpd/help", as: :mpd_help
get 'status'
post 'start'
post 'stop'
post 'next'
post 'previous'
post 'pause'
post 'update'
# post 'play_song/:id', to: 'mpd#play_song'
end
# For some reason this path must not be in the namespace?!
post '/mpd/play_song/:id', to: 'mpd#play_song', as: 'mpd_play_song'
root 'static#home'
#match '*path' => 'static#home', via: [:get, :post]
end
为什么我必须在命名空间之外指定mpd_play_song_path? 它使用相同的控制器和一个函数,但是,当它放在命名空间中时我收到以下错误:
undefined method `mpd_play_song_path' for #<#<Class:0x007f2b30f7fd20>:0x007f2b30f7eb50>
这就是我认为的界限:
= link_to("Play", mpd_play_song_path(song[:id])
我觉得这很奇怪,除了通过id
之外没有任何理由它为什么不能工作。
如果你需要更多代码,请打我。 提前谢谢,
菲尔
答案 0 :(得分:1)
<强>命名空间强>
拥有命名空间并不表示您的路由将采用的控制器。
命名空间基本上是一个文件夹,您可以在其中放置控制器。 您仍然必须使用https://jsfiddle.net/sebastianbrosch/w1o2f7yy/并设置控制器操作:
#config/routes.rb
namespace :mdp do
resources :controller do
collection do
get :help #-> url.com/mdp/controller/help
end
end
end
在我看来,您想要使用mdp
控制器,这意味着您将按如下方式设置路线:
#config/routes.rb
resources :mdp do
get :help, action: :show, type: :help
get :status, action: :show, type: :status
...
end
更简洁的方法是使用resources
directive:
#config/routes.rb
resources :mdp, except: :show do
get :id, to: :show, constraints: ActionsConstraints
end
#lib/actions_constraints.rb
class NewUserConstraint
def self.matches?(request)
actions = %i(help status)
actions.include? request.query_parameters['id']
end
end