Rails url_for и модели пространства имен - PullRequest
13 голосов
/ 10 декабря 2010

В 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?

UPDATE

Итак, спустя почти 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.

Ответы [ 4 ]

24 голосов
/ 23 ноября 2012

Просто определите use_relative_model_naming? в содержащем модуле, чтобы избежать префикса сгенерированных имен маршрутов:

module M
  def self.use_relative_model_naming?
    true
  end
end
4 голосов
/ 10 декабря 2010

Использование

namespace "blah" do
  resources :thing
end

Тогда маршруты будут названы соответствующим образом.

rake routes

Для просмотра всех маршрутов

3 голосов
/ 04 января 2011

Укажите модуль на маршруте

resources :users, :module => "m"

или используйте для этого область действия

scope :module => "m" do
  resources :users
end
0 голосов
/ 28 марта 2013

В моем случае я переопределил метод url_for в моем файле application_helper.rb, чтобы добавить параметр: network на все маршруты из моего пространства имен: 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
...