Ответ 1
Просто определите use_relative_model_naming?
в содержащем модуле, чтобы избежать префикса сгенерированных имен маршрутов:
module M
def self.use_relative_model_naming?
true
end
end
В 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
жалуется на метод undefined 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
?
UPDATE
Итак, через почти 5 лет, вот решение, благодаря эсад. Это было протестировано в 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
.
Просто определите use_relative_model_naming?
в содержащем модуле, чтобы избежать префикса сгенерированных имен маршрутов:
module M
def self.use_relative_model_naming?
true
end
end
Используйте
namespace "blah" do
resources :thing
end
Затем маршруты будут названы соответственно.
rake routes
Чтобы просмотреть все маршруты
Укажите модуль на маршруте
resources :users, :module => "m"
или использовать область действия для нее
scope :module => "m" do
resources :users
end
В моем случае я переопределил метод url_for в файле application_helper.rb, чтобы добавить: network param для всех маршрутов из моего пространства имен: mkp.
module ApplicationHelper
def url_for(options = {})
if options.is_a?(Hash) && options.has_key?(:controller)
if options[:network].nil? && options[:controller].match(/^mkp\//).present?
options[:network] = @network.downcase
end
end
super(options)
end
end