【问题标题】:Rails routes config thinks action method is an object idRails 路由配置认为 action 方法是一个对象 id
【发布时间】:2016-10-25 20:45:47
【问题描述】:

我正在开发rails应用,遇到了这样的问题。

我有movies_controller.rb,我在其中定义了这些操作和路线:

            Prefix Verb   URI Pattern                   Controller#Action
            movies GET    /movies(.:format)             movies#index
                   POST   /movies(.:format)             movies#create
         new_movie GET    /movies/new(.:format)         movies#new
        edit_movie GET    /movies/:id/edit(.:format)    movies#edit
             movie GET    /movies/:id(.:format)         movies#show
                   PATCH  /movies/:id(.:format)         movies#update
                   PUT    /movies/:id(.:format)         movies#update
                   DELETE /movies/:id(.:format)         movies#destroy
              root GET    /                             redirect(301, /movies)
movies_by_director GET    /movies/by_director(.:format) movies#by_director

但是当我尝试转到 /movies/by_director?director="something" 时,rails 认为我正在导航到带有参数 :id = by_directormovies#show 操作。

我做错了什么?

【问题讨论】:

    标签: ruby-on-rails ruby url routes rails-routing


    【解决方案1】:

    路由按照指定的顺序进行匹配,因此请确保“by_director”的路由定义高于电影的资源路由。

    这样的事情应该可以解决问题:

    get '/movies/by_director' => 'movies#by_director'
    resources :movies
    

    【讨论】:

    • 确实如此。 :) 谢谢!
    【解决方案2】:

    这里有两个问题:

    1. :id 的默认模式匹配非常松散,以至于 by_director 被解释为 :id
    2. 路由按顺序匹配,GET /movies/:id 出现在 GET /movies/by_director 之前。

    您可以在resources :movie 之前手动将GET /movies/by_director 定义为infused suggests,或者您可以添加一个约束来缩小:ids 的外观:

    resources :movies, constraints: { id: /\d+/ } do
      #...
    end
    

    如果只有一两个要处理的路线,手动排序路线很好,约束 :id (IMO) 更简洁且不易出错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      相关资源
      最近更新 更多