2015-10-02 66 views
1

路線讓我們開始與一些代碼:添加鏈接namespace'd Rails中

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

命名空間

有一個命名空間不表示控制器的路線將承擔。

命名空間基本上是一個文件夾,您可以在其中放置控制器。 你仍然必須使用resources directive並設置控制器操作:

#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 

一個更簡潔的方式將是使用constraints

#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