2017-04-06 112 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将是相同的,但与额外的空间。