Пространства имен - PullRequest
       14

Пространства имен

0 голосов
/ 30 ноября 2009

Это отрывок из моего файла config / rout.rb:

resources :accounts do |account|

      account.resource :profile, :except => [:new, :create, :destroy]

      account.resources :posts,
                        :collection => { :fragment => :get },
                        :has_many => [:comments, :likes]

      # even more code

end

Мне бы хотелось, чтобы каждый вложенный ресурс загружался из пространства имен учетной записи, например Account :: PostsController вместо PostsController .

Используя ресурсы :accounts, :namespace => 'account' пытается загрузить AccountPostsController.

Попытка вложить структуру не очень хорошо работает:

map.namespace :account do |account|
..
end

Предыдущий код будет загружать файлы из нужных мне мест, однако он добавляет пространство имен к URL и сгенерированным путям, поэтому у меня будут такие методы, как account_account_posts_url и аналогичные пути.

Другая альтернатива - использовать что-то вроде:

account.resource :profile, :controller => 'account/profile'

Мне действительно не нравится это, так как это включает в себя как дублирование кода, так и вынуждает меня удалить некоторых из магических помощников рельсов.

Есть мысли и предложения?

Ответы [ 2 ]

1 голос
/ 01 декабря 2009

Как насчет этого?

map.resources :accounts do |accounts|
  accounts.with_options(:namespace => "account") do |account|
    account.resource :profile, :except => [:new, :create, :destroy]
    ...
  end
end

Я не пробовал этого, поэтому понятия не имею, сработает ли это, но это только начало. См. Rails Routing для получения более подробной информации и опций о том, что можно сделать с помощью Rails Routes.

После голосования "за"

Итак, я провел какой-то тест. Изменив мой routes.rb и запустив rake routes, я получил следующее (довольно близко к тому, с чего мне пришлось начать):

map.resources :accounts do |accounts|
  accounts.namespace :account do |account|
    account.resource :profile, :except => [:new, :create, :destroy]
  end
end

Это дает вам то, что вы хотите. Правильный URL и указатель на account/... контроллер.

0 голосов
/ 01 декабря 2009

Так что конкретно не так с пространством имен? Я думаю, это то, что вы пытаетесь сделать:

map.namespace :account do |account|
  account.resource :profile
end

Это попытается загрузить контроллер в app / controllers / account / profile_controller.rb и сгенерирует маршруты, такие как account_profile_path.

Обновлено на основе комментария :

map.resources :accounts do |account| 
 account.resource :profile
end

Даст вам / account / 22 / profile .

...