我几乎肯定有人之前曾问过这个问题,但我似乎无法用正确的一系列单词来找到它。
我有一个资源,游戏,包含所有正常的资源-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))'
答案 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
路由成为资源声明的一部分,则不会发生这种情况。