2017-04-06 117 views
2

最近我碰到問題的問題在訪問命名空間的控制器我有education/educations_controller.rb父控制器訪問子命名空間控制器

class Education::EducationssController < ApplicationController 
    def process_educations 
    if highschool 
     controller_to_redirect = 'highschool' 
    if bacholors 
     controller_to_redirect = 'bacholors' 
    else 
     controller_to_redirect = 'masters' 
    end 
    redirect_to :controller => controller_to_redirect, :action => 'process_educations' 
    end 
end 

和三個子控制器education/highschool_controller.rbeducation/bacholors_controller.rbeducation/masters_controller.rb的所有指標的影響存在於educations_controller.rb傳遞到這些控制器

class Education::HighschoolController < Education::EducationssController 
    def proceed_educations 
    do some process 
    end 
end 


class Education::BacholorsController < Education::EducationssController 
    def proceed_educations 
    do some process 
    end 
end 


class Education::MastersController < Education::EducationssController 
    def proceed_educations 
    do some process 
    end 
end 

而且各個視圖來之後但在這個過程中的U RL變得太長,所以我想把除去從URL的所有控制器然後處理這樣不論什麼用戶被引導到同一個URL,對於本我改變routes.rb作爲

namespace :educations,:path => '' do 
    scope "/educations" do 
    get 'proceed_educations',to:'educations#proceed_educations' 
    post 'proceed_educations',to:'educations#proceed_educations' 
    end 
    resource :highschool ,:path => '' do 
    get 'proceed_educations',to:'highschool#proceed_educations' 
    post 'proceed_educations',to:'highschool#proceed_educations' 
    end 
    resource :bacholors ,:path => '' do 
    get 'proceed_educations',to:'bacholors#proceed_educations' 
    post 'proceed_educations',to:'bacholors#proceed_educations' 
    end 
    resource :masters ,:path => '' do 
    get 'proceed_educations',to:'masters#proceed_educations' 
    post 'proceed_educations',to:'masters#proceed_educations' 
    end 
end 

這產生相同的URL爲每個控制器但是當我嘗試訪問他們,如educations_controller.rb他們總是重定向到相同的控制器HighschoolController

我不明白我在做什麼事情錯了,請幫我理解這個過程,或者如果有更好的方法做到這一點,那麼請建議。

+1

'/ educations/highschool'的網址太長了?如果是的話,爲什麼不把它做成'/ highschool'?也許我不明白你的意圖,但問題是你正在爲多個路線定義相同的端點(它究竟是怎麼知道去哪裏的?) – engineersmnky

+0

另外,它會去高中路線,因爲該網址是第一個比賽。 Rails獲取請求,然後滾動路徑文件直到找到第一個匹配的路由(它不會繼續查看是否可能更緊密)。在這種情況下,它找到高中路線作爲比賽。 – bkunzi01

+0

那麼我如何隱藏控制器的名稱從URL和顯示所有控制器的動作從相同的網址 – Mike

回答

1

如果您想避免爲兩個名稱空間控制器創建相同的URL,那麼導軌很難理解哪個控制器發送哪個請求。

不過,你所能做的就是,在你routes.rb,可以消除顯示控制器名稱,可以有差異化增加空間,就像這樣:

namespace :educations,:path => '' do 
    scope "/educations",:path => '' do 
    get 'proceed_educations',to:'educations#proceed_educations',:path => '' 
    post 'proceed_educations',to:'educations#proceed_educations',:path => '' 
    end 
    resource :highschool ,:path => '' do 
    get 'proceed_educations',to:'highschool#proceed_educations' 
    post 'proceed_educations',to:'highschool#proceed_educations' 
    end 
    resource :bacholors ,:path => ' ' do 
    get 'proceed_educations',to:'bacholors#proceed_educations',:path => '' 
    post 'proceed_educations',to:'bacholors#proceed_educations',:path => '' 
    end 
    resource :masters ,:path => ' ' do 
    get 'proceed_educations',to:'masters#proceed_educations',:path => '' 
    post 'proceed_educations',to:'masters#proceed_educations',:path => '' 
    end 
end 

這樣,URL將是相同的,但與額外的空間。