Введение namespace в проект

3 views
Skip to first unread message

placement_new

unread,
Nov 20, 2009, 11:35:53 AM11/20/09
to RubyOnRails to russian
Накопилось некоторое число контроллеров/моделей. Необходимо ввести
каталоги для них, где бы они хранились по группам.
REST не используется. Какой rails way для этого?
Введение namespace? Но тогда в роутинге придется все контроллеры
перечислять?
Или можно просто рассовать по папкам и добавить эти каталоги в пути
поиска моделей, контроллеров, хедперов итд.
Спасибо.

labria

unread,
Nov 20, 2009, 12:27:39 PM11/20/09
to RubyOnRails to russian
Я думаю самое простое будет добавить папки в load_path и PROFIT.
Неймспейсы это хорошо, но вам, судя по всему, не нужно == лишний
геморой.

On Nov 20, 6:35 pm, placement_new

placement_new

unread,
Nov 21, 2009, 3:03:43 AM11/21/09
to RubyOnRails to russian
Добавил в load_paths пути. при старте происходит ошибка, что не найден
модуль-хелпер
присерно такого содержания
expected .../app/helpers/directories/city_helper.rb to define
Directories::CityHelper
directories это папка которую я руками создавал и добавлял в
load_paths

placement_new

unread,
Nov 21, 2009, 3:47:07 AM11/21/09
to RubyOnRails to russian
Мне придется все переименовать на <name_directory>:: ?

On 21 ноя, 11:03, placement_new <acheremukhin.digitalgu...@gmail.com>
wrote:

Sergey Kruk

unread,
Nov 21, 2009, 5:18:22 AM11/21/09
to ror...@googlegroups.com
> Мне придется все переименовать на <name_directory>:: ?

Да. Это как если сразу сгенерировать контроллер ./script/generate
controller directory/city

Max Lapshin

unread,
Nov 21, 2009, 6:02:13 AM11/21/09
to ror...@googlegroups.com
Погодите, когда кладешь модели в подпапку, ничего не надо
переписывать. Может дело в том, что helpers :all ?

Sergey Kruk

unread,
Nov 21, 2009, 6:20:38 AM11/21/09
to ror...@googlegroups.com
namespace -- это для контроллеров:

http://api.rubyonrails.org/classes/ActionController/Routing/RouteSet/Mapper.html#M000556

И, если сгенерировать контроллер как в примере, то в папке
app/helpers/admin будет лежать products_helper.rb, который будет
содержать определение Admin::ProductsHelper.

Max Lapshin

unread,
Nov 21, 2009, 6:34:44 AM11/21/09
to ror...@googlegroups.com
2009/11/21 Sergey Kruk <serge...@gmail.com>:

> namespace -- это для контроллеров:
>

Именование моделей подчиняется тем же правилам. Просто в руби
классические namespaces
реализуются модулями, а вот в маршруты рельс попал классический термин.

Sergey Kruk

unread,
Nov 21, 2009, 6:43:20 AM11/21/09
to ror...@googlegroups.com
> Именование моделей подчиняется тем же правилам.

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

placement_new

unread,
Nov 21, 2009, 8:22:30 AM11/21/09
to RubyOnRails to russian
Так что-нибудь в роутинге надо прописывать?
А то, я так понял контроллер просто так не запихать в подпапку?

Ivan Evtuhovich

unread,
Nov 21, 2009, 8:24:40 AM11/21/09
to ror...@googlegroups.com
А представь, что у тебя моделей больше 100, если их каким-то способом по папочкам не рассортировать, то работать с таким количеством станет совсем неудобно.

2009/11/21 Sergey Kruk <serge...@gmail.com>

Max Lapshin

unread,
Nov 21, 2009, 8:37:22 AM11/21/09
to ror...@googlegroups.com
2009/11/21 Ivan Evtuhovich <evtuh...@gmail.com>:

> А представь, что у тебя моделей больше 100, если их каким-то способом по
> папочкам не рассортировать, то работать с таким количеством станет совсем
> неудобно.

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

undr

unread,
Nov 24, 2009, 6:55:32 AM11/24/09
to RubyOnRails to russian
> Введение namespace? Но тогда в роутинге придется все контроллеры
> перечислять?

Чтобы все контроллеры не перечислять я делал примерно так:

map.namespace :admin do |admin|
admin.admin_root "", :controller => "dashboard", :action =>
'index'
%w{ controller1 controller2 controller3 }.each do |c|
admin.send "#{c}", "#{c}/:action/:id", :controller => "#{c}"
end
end

Maxim Kulkin

unread,
Nov 24, 2009, 7:05:26 AM11/24/09
to ror...@googlegroups.com
Это Вы называете "не перечислять все контроллеры" ? =)
К тому же, с таким решением "/admin" префиксы пути все равно будут.

Я бы засунул в подпапки, добавил бы соответствующий модуль-префикс для
контроллеров в папках, и не насиловал бы себе мозг.

24 ноября 2009 г. 14:55 пользователь undr <lili...@gmail.com> написал:

placement_new

unread,
Nov 24, 2009, 8:50:01 AM11/24/09
to RubyOnRails to russian
а с Вашим подходом они разве не нужны будут?
префиксы в путях.

On 24 ноя, 15:05, Maxim Kulkin <maxim.kul...@gmail.com> wrote:
> Это Вы называете "не перечислять все контроллеры" ? =)
> К тому же, с таким решением "/admin" префиксы пути все равно будут.
>
> Я бы засунул в подпапки, добавил бы соответствующий модуль-префикс для
> контроллеров в папках, и не насиловал бы себе мозг.
>

> 24 ноября 2009 г. 14:55 пользователь undr <lilipo...@gmail.com> написал:

Maxim Kulkin

unread,
Nov 24, 2009, 10:26:26 AM11/24/09
to ror...@googlegroups.com
Давайте сначала определимся, что мы тут все понимаем под "префиксы в
путях". Я говорю о значениях опции path_prefix для
ActionController::Routing::RouteSet::Mapper#connect, что означает
префикс в урлах.

В приведенном примере с использованием #namespace, результат будет такой:
1) у контроллеров будет префикс "admin/" (т.е. они будут искаться в
модуле Admin)
2) у урл-хелперов будет префикс admin_ (например admin_my_controller_path)
3) у урлов будет префикс "/admin" (например, "/admin/my_controller")

Как я понял, надо всего лишь сделать эффект первого пункта, без
привнесения эффектов от остальных двух (т.е. чтобы все контроллеры
искались в определнном модуле, но урлы и урл-хелперы остались без
изменений).

Судя по реализации, это делается указанием опции :namespace :

ActionController::Routing::RouteSet.draw do |map|
map.with_options(:namespace => "admin/") do |admin|
admin.connect 'posts/:action/:id', :controller => "posts"
# то же самое, что и
# map.connect "posts/:action/:id", :controller => 'admin/posts'
end
end

Ну а дальше можно или перечислить имена контроллеров руками, чтобы
проитерироваться по ним и сделать соотв. map.connect; или найти все
файлы внутри app/controllers/**/*_controller.rb и тоже сделать
map.connect.

24 ноября 2009 г. 16:50 пользователь placement_new
<acheremukhin...@gmail.com> написал:

Reply all
Reply to author
Forward
0 new messages