Маршруты и модули Rails 3

У меня есть модель AR внутри модуля

class Long::Module::Path::Model < ActiveRecord::Base
end

и хотите использовать следующие маршруты (без имен модулей, потому что их легче писать и запоминать)

resources :models

но Rails 3 всегда хочет использовать такой URL, как

long_module_path_model_url

Есть ли способ изменить это поведение?

Надеюсь, кто-нибудь там может мне помочь?

Марио


person Mario Uher    schedule 17.06.2010    source источник


Ответы (3)


Мне немного любопытно, почему вы ссылаетесь на модель, когда говорите о маршрутизации, которая обрабатывает только уровень контроллера; но эта статья должна быть полезной: Пространства имен и маршрутизация контроллера R3

«Если вы хотите направить /photos (без префикса /admin) в Admin::PostsController, вы можете использовать:

scope :module => "admin" do
  resources :posts, :comments
end

"

Если вы хотите изменить именованные пути, вы можете использовать :as, как указано здесь: R3 Добавление префикса к помощникам именованных маршрутов

Так что я предполагаю что-то вроде

1:

scope :module => 'long/module/path' do
   resources :model, :as => :model
end

или 2:

scope :module => 'long' do
  scope :module => 'module' do 
   scope :module => 'path' do
    resources :model, :as => :model
   end end end

Это то, что вы ищете.

person Tim Snowhite    schedule 13.09.2010
comment
Нет, вы меня не поняли ;) Я хочу получить доступ к своим моделям с помощью model_path(@model), а не с помощью long_module_path_model(@model). Кажется, не работает. - person Mario Uher; 24.09.2010
comment
Возможно, исправленная версия выше лучше. - person Tim Snowhite; 24.09.2010

resources :your_looooooong_model_name, :as => :short

Дал бы вам shorts_url и т. д.

person numbers1311407    schedule 17.06.2010
comment
Нет, извините, у меня не сработало... Теперь много ошибок маршрутизации. - person Mario Uher; 18.06.2010

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

Вам необходимо переопределить метод model_name, как показано ниже:

class Long::Module::Path::Model < ActiveRecord::Base
  def self.model_name
    ActiveModel::Name.new(Long::Module::Path::Model, nil, "YourNewModelName")
  end
end

Кредит принадлежит этому комментарию.

person wanghq    schedule 31.10.2014