Ruby on rails Rails路由--添加自定义路由

Ruby on rails Rails路由--添加自定义路由,ruby-on-rails,rails-routing,Ruby On Rails,Rails Routing,我几乎可以肯定以前有人问过这个问题,但我似乎找不到合适的一系列词来找到它 我有一个资源,游戏,所有正常的资源路径。创建、编辑等 我已经在GamesController中创建了一个名为json的新操作,我希望能够在mydomain.com/games/json上访问该操作,但路由一直选择“json”作为ID,并将其路由到“show”操作 这大概是因为默认路线: match ':controller(/:action(/:id))' 我已经尝试了很多方法,但无论我做什么,它都会一直路由到“show

我几乎可以肯定以前有人问过这个问题,但我似乎找不到合适的一系列词来找到它

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

我已经在GamesController中创建了一个名为json的新操作,我希望能够在mydomain.com/games/json上访问该操作,但路由一直选择“json”作为ID,并将其路由到“show”操作

这大概是因为默认路线:

match ':controller(/:action(/:id))'
我已经尝试了很多方法,但无论我做什么,它都会一直路由到“show”。我一直在尝试使用它来解决这个问题,但对于rails新手来说,它需要接受和应用

我想说的是,对于任何控制器/json都会将您带到json操作(而不是使用id“json”显示),但我同意必须为每个控制器单独指定它

非常感谢您的帮助。(即使这只是指向已经回答的问题。)在所有情况下,我都将尝试创建的路由置于默认路由之上

我的路线:

  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))'

好的,那么您需要做的是将自定义json路由置于其他资源路由之上,并将其设置为默认值,如下所示:

get '/:controller/json(/:id)', action: 'json'
resources :events, :players, :sets, :matches, :characters, :videos, :games,         :event_instances, :game_instances
...
您的困惑与路由的构建方式和URL的解析方式有关

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

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

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

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

注意:

我不太确定这是用于路由的最佳设计模式,我更愿意使用带有基本CRUD操作的传统REST路由,它将实现respond_to模式来响应特定的json请求

请参见以下文档:

当你的应用程序增长时,在你所有资源之上添加这样的“一网打尽”路线可能会有风险

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

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
,这最终会让您的URL难以阅读和维护,也会让您的URL更难有一致的“语法”


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

您可以显示您的路由吗?我们需要它来有效地回答。也许我们应该知道。它们已经被添加。谢谢,我已经回答了你下面的问题,我想我会当场回答。当你不确定自己在寻找什么时,很难找到答案。非常感谢。(我链接的指南中的这一部分现在有了一些上下文,所以更有意义了。)参考尼科博加斯特的回答。他的策略将为所有资源控制器定义一个
json
路由,这可能是您想要的行为。(我个人仍然会使用
get
而不是
match