在Rails

时间:2015-10-02 11:21:30

标签: ruby-on-rails routes

让我们从一些代码开始:

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之外没有任何理由它为什么不能工作。

如果你需要更多代码,请打我。 提前谢谢,

菲尔

1 个答案:

答案 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