Возможно ли в Rails размещать модели пространств имен в модулях и при этом получать правильное поведение от url_for
?
Например, здесь url_for
работает как положено:
# app/models/user.rb
class User < ActiveRecord::Base
end
# config/routes.rb
resources :users
# app/views/users/index.html.haml
= url_for(@user) # /users/1
Тогда как после помещения модели User
в модуль url_for
жалуется на неопределенный метод m_user_path
:
# app/models/m/user.rb
module M
class User < ActiveRecord::Base
end
end
# config/routes.rb
resources :users
# app/views/users/index.html.haml
= url_for(@user) # undefined method 'm_users_path'
Возможно ли, чтобы url_for
игнорировал модуль в M::User
и возвращал user_path
для url_for(@user)
вместо m_user_path
?
ОБНОВЛЕНИЕ
Итак, спустя почти 5 лет, вот решение, благодаря esad. Это было протестировано в Rails 4.2.
# app/models/m/user.rb
module M
class User < ActiveRecord::Base
end
end
# app/models/m.rb
module M
def self.use_relative_model_naming?
true
end
def self.table_name_prefix
'm_'
end
end
# config/routes.rb
resources :users
# app/views/users/index.html.haml
= url_for(@user) # /users/1
Примечание: при создании модели, представления и контроллера с помощью bin/rails g scaffold m/user
представления и контроллер также будут иметь пространство имен. Вам нужно переместить app/views/m/users
в app/views/users
и app/controllers/m/users_controller.rb
в app/controllers/users_controller.rb
; также нужно убрать ссылки на модуль M
везде, кроме модели M::User
.
Наконец, целью здесь были модели пространств имен, а не представления и контроллеры. В решении esads модулю M
(содержащему User
) явно приказано не появляться в маршрутах. Таким образом, фактически M
удаляется и остается только User
.
Пользовательская модель теперь может находиться в app/views/models/m/user.rb
, пользовательский контроллер находится в app/views/controllers/users_controller.rb
, а представления можно найти в app/views/users
.