2

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

我有一个资源 Games,它包含所有正常的资源路径。创建、编辑等

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

大概这是因为默认路由:

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

我已经尝试了很多东西,但无论我做什么,它都会一直路由到“显示”。我一直在尝试使用本指南来解决这个问题,但是对于那些刚接触 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))'
4

2 回答 2

2

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

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

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

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

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

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

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

注意:

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

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

当您的应用程序增长时,在您的所有资源之上添加这样的“catch all”路由可能会变得有风险。

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

于 2013-08-24T16:30:57.660 回答
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路由成为资源声明的一部分,则不会发生这种情况。

于 2013-08-24T16:37:17.370 回答