Синтаксис Rails rout.rb - PullRequest
       25

Синтаксис Rails rout.rb

7 голосов
/ 09 января 2012

Я искал и искал, и я не могу найти страницу, в которой прописан синтаксис route.rb в Rails 3. Существуют рекомендации, обзоры, даже расширенные примеры, но почему нет страницы, где прописан точный синтаксис каждого ключевого слова ?? Эта страница

http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/

содержит много сложных примеров, но не тратит время на обсуждение поведения всех приведенных примеров. Я был бы признателен, если бы кто-то мог указать мне на страницу, которая нарушает синтаксис route.rb.

Вот проблема, которую я пытаюсь решить. У меня есть две модели ModelA и ModelB. Отношение модельA имеет_много модельВ, а модельВ принадлежит_ моделиА. Я создал контроллер для модели B под пространством имен модели A. Итак, в моей папке приложения rails у меня есть

app/controllers/modelA_controller.rb
app/controllers/modelA/modelB_controller.rb

Я хочу, чтобы мои маршруты были такими:

http://localhost:3000/modelA/:modelA_id/modelB/  [index]
http://localhost:3000/modelA/:modelA_id/modelB/:modelB_id  [show]
etc.

Я попытался выполнить следующие действия в routs.rb, и ничего из этого не работает:

resources :modelA do
  resources :modelB
end
--
resources :modelA do
  member do
    resources :modelB
  end
end
--
namespace :modelA do
  resources :modelB
end
--
match '/modelA/:modelA_id/modelB/action', :to => '/modelA/modelB#action'

Я знаю, что некоторые вещи, которые я пробовал, явно не верны, но когда вы потратили 2 дня на одну проблему, все пошло!

1 Ответ

0 голосов
/ 09 января 2012

Причина, по которой никто не имеет «окончательного» руководства по синтаксису маршрутизации, заключается в том, что он довольно гибкий, поэтому вы, вероятно, могли бы написать несколько глав только по этой теме. Тем не менее, я бы порекомендовал: http://guides.rubyonrails.org/routing.html

Исходя из вашего вопроса, звучит так, как будто вы называете пространство modelB в modelA, но вы также хотите, чтобы id для modelA находилось внутри самого маршрута.

Так что если ваш ModelBController выглядит примерно так:

class ModelA::ModelBController < ApplicationController
  # controller code here
end

тогда вы можете просто сделать:

resources :modelA do
  resources :modelB, :module => :modelA
end

Однако, вы уверены, что хотите так именовать пространство контроллера? Если вам просто нужны вложенные ресурсы, например типичные отношения has_many, вам не нужно указывать пространство имен modelB в modelA.

Вместо этого у вас будет:

/app
  /controllers
    /modelA
      # some files
    /modelB
      # some files

И ваш modelB контроллер будет:

class ModelBController < ApplicationController
  # controller code here
end

Тогда вы могли бы сделать

resources :modelA do
  resources :modelB
end
...