【问题标题】:Rails: Mapping Conflicting Routes by Detecting ParamRails:通过检测参数映射冲突路线
【发布时间】:2010-06-29 23:45:27
【问题描述】:

嘿!我正在尝试在 Rails 应用程序中设置路由,以便根据传递的参数类型,Rails 将请求发送到不同的操作。

我有courses,它有一个属性state,它是一个带有两个字母状态缩写的字符串。当用户访问/courses/1 时,我希望Rails 在courses 控制器中显示show 操作(并将参数作为:id 传递)。但是,当用户访问/courses/CO 时,我希望Rails 显示index 操作并将参数作为:state 传递。

所以/courses/1 相当于

:controller => 'courses', :action => 'show', :id => '1'

/courses/CO 将等同于

:controller => 'courses', :action => 'index', :state => 'CO'

我试过这个:

map.resources :courses, :except => { :index, :show }
map.connect 'courses/:state', :controller => 'courses', :action => 'index', :state => /[A-Z]{2}/
map.connect 'courses/:id',    :controller => 'courses', :action => 'show', :id => /[0-9]+/

但是它坏了(rails 服务器甚至无法启动)。我通常不会对路线做这样的事情,所以我不知道如何做。谢谢!

编辑:修正了一个错字,感谢 JC。

当前的解决方案如下所示:

map.resources :courses, :except => [ :index, :show ]
  map.courses  '/courses',        :controller => 'courses', :action => 'index', :state => 'AL', :method => :get
  map.courses  '/courses/:state', :controller => 'courses', :action => 'index', :requirements => { :state => /[A-Z]{2}/ }, :method => :get
  map.course   '/courses/:id',    :controller => 'courses', :action => 'show',  :requirements => { :id => /[0-9]+/      }, :method => :get

【问题讨论】:

    标签: ruby-on-rails ruby routes


    【解决方案1】:

    这可行,但您需要编辑所有指向索引的链接以说出 courses_path('AA') 之类的内容,并且您将无法使用一些不错的助手,例如 form_for,假设您正在关注#create 只是带有 POST 请求的 #index 的约定。 (熟悉 form_tag)

    ActionController::Routing::Routes.draw do |map|
      map.resources :courses, :except => [ :index, :show ]
      map.courses  '/courses/:state', :controller => 'courses', :action => 'index', :requirements => { :state => /[A-Z]{2}/ } , :method => :get
      map.course   '/courses/:id',    :controller => 'courses', :action => 'show',  :requirements => { :id => /[0-9]+/      } , :method => :get
    end
    

    不过,它会保持您的路线名称相同。

    (顺便说一句,您的 /co 与您的正则表达式不匹配,这需要大写字符)


    有趣的是:我们真的需要路由器的抽象吗? http://blog.peepcode.com/tutorials/2010/rethinking-rails-3-routes

    【讨论】:

    • 允许默认情况(无参数)是否会阻止我更改所有这些链接?例如:map.connect '/courses', :controller => 'courses', :action => 'index', :state => 'AL', :method => :get
    【解决方案2】:

    恐怕这不会起作用,因为将路径映射到控制器和操作的结构是在 Rails 应用程序启动时设置的,参数处理发生在请求时。

    您可以做的是将 CoursesController 的 show-action 中的 :id 参数与有效状态列表进行匹配,然后重定向或呈现不同的操作。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-04-18
      • 2013-03-14
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多