Rails路由配置认为action方法是一个对象id

时间:2016-10-25 20:45:47

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

我正在开发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"时,我认为,我正在使用参数movies#show导航到:id = by_director行动。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

路由按照指定的顺序进行匹配,因此请确保" by_director"的路由。定义以上电影的资源路径。

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

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

答案 1 :(得分:1)

这里有两个问题:

  1. :id的默认模式匹配非常宽松,by_director被解释为:id
  2. 路线按顺序匹配,GET /movies/:id出现在GET /movies/by_director之前。
  3. 您可以在GET /movies/by_director作为infused suggests之前手动定义resources :movie,或者您可以添加约束以缩小:id的内容:

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

    如果只处理其中的一个或两个,手动排序路线很好,约束:id(IMO)更清洁,更不容易出错。