Rails路由 - 添加自定义路由

时间:2013-08-24 16:25:40

标签: ruby-on-rails rails-routing

我几乎肯定有人之前曾问过这个问题,但我似乎无法用正确的一系列单词来找到它。

我有一个资源,游戏,包含所有正常的资源-y路径。创建,编辑等

我在GamesController中创建了一个名为json的新动作,我希望能够在mydomain.com/games/json上访问该路由,但是路由会不断将“json”作为ID并将其路由到“show”而不是行动。

大概这是因为默认路线:

match ':controller(/:action(/:id))'

我尝试了很多东西,但无论我做什么,都会继续路由到'show'。我一直在尝试使用this guide来解决这个问题,但是对于那些非常陌生的人来说,可以接受并申请。

我想说,对于任何控制器/ json都会带你进入json动作(而不是带有id'json'的show),但我不得不单独为每个控制器指定它。

非常感谢任何帮助。 (即使那只是指向我已回答的问题。)在所有情况下,我一直在放置我试图在默认路线上创建的路线。

我的路线:

  root :to => 'home#index'
  resources :events, :players, :sets, :matches, :characters, :videos, :games, :event_instances, :game_instances
  resource :user_session
  resource :account, :controller => "users"
  resources :users
  match '/login', :to => 'user_sessions#new', :as => 'login'
  match '/logout', :to => 'user_sessions#destroy', :as => 'logout'
  match '/register', :to => 'users#create', :as => 'register'
  match '/games/json', :to => 'games#json', :as => 'gameList'
  match ':controller(/:action(/:id))'

2 个答案:

答案 0 :(得分:2)

好的,你需要做的是将你的自定义json路由放在你的其他资源路由之上,并将其设置为默认值:

get '/:controller/json(/:id)', action: 'json'
resources :events, :players, :sets, :matches, :characters, :videos, :games,         :event_instances, :game_instances
...

您的困惑与构建路线和解析网址的方式有关

将您的routes.rb文件视为要应用于客户端请求的网址的一组连续过滤器。

如果您将默认路由放在另一个上面,它将捕获与给定模式匹配的所有请求=>这意味着当你在json路由上添加所有资源路由时,所有匹配/#{resources} /:id模式的url(以及/ games / json就是其中之一)都会在它们到达json自定义路由之前被捕获

通过将您的自定义路由置于其他路由之上,您可以捕获与该模式匹配的任何请求,这意味着在这种情况下所有请求都带有

/#{controller_name or resource_name)}/json(/:id)

注意:

我不太确定这是用于路由的最佳设计模式,我宁愿选择传统的REST路由,使用基本的CRUD操作来实现respond_to模式来回答特定的json请求。

请参阅文档:http://apidock.com/rails/ActionController/MimeResponds/InstanceMethods/respond_to

在您的应用增长时,在所有资源之上添加此类“全部捕获”路线可能会带来风险。

但你可能有理由这样做,在这种情况下,我认为我的答案符合你的需要。

答案 1 :(得分:0)

resources :games do
  collection do
    get :json
  end
end

如果您还想添加一个行为,该行为需要一个:id路径段,并返回一个特定游戏的json表示,那么您可以使用

resources :games do
  collection do
    get :json
  end
  member do
    get :json
  end
end

我补充一点,当我是Rails的新手(不到1。5年前)时,由于某种原因,路由dsl对我来说真的很难理解。但值得研究这个指南,尽管事实上它起初有点压倒性。否则你最终会得到一堆match '/route/to/somewhere' => 'controller#action', :as => :some_helper,最终会让人感到痛苦。保持并使你的网址更加难以拥有一致的“语法”。

编辑:查看您现在发布的路线文件,问题是您在games/json声明后声明了resources :games路线。路由匹配优先级从文件顶部开始向下进行,因此games的资源路由首先匹配,并且永远不会检查稍后声明的特定路由。如果您使用上面的语法使您的json路由成为资源声明的一部分,则不会发生这种情况。