Область видимости и/или вложенность маршрута в Rails 3

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

У меня есть следующие маршруты:

  resources :foos
  resources :bars
  resources :bazs do
    resources :hellos
    resources :worlds
  end

Все модели foo, bar и baz принадлежат пользовательской модели. Я не хочу вкладывать еще один слой, но я хочу иметь префикс в своем URL-адресе, который соответствует атрибуту постоянной ссылки пользователя (аналогично каждому репозиторию github с префиксом имени пользователя). Итак, у меня есть предварительный фильтр на всех моих контроллерах.

  def get_scope
    @user = User.find_by_permalink(params[:permalink])
  end

Изменен to_param благодаря @cowboycoded

  class User < ActiveRecord::Base  
    def to_param
      permalink
    end
  end

Я обернул эти маршруты с

  scope ":permalink", :as => :user do
    #nested routes here
  end

Теперь все работает нормально, пока я передаю @user каждому неиндексному маршруту. Это не кажется очень сухим, чтобы вернуться ко всем моим представлениям и заменить (@foo) на (@user, @foo), когда он уже определен.

Если я не ошибаюсь, метод to_param просто заменяет :id, чтобы URL-адреса, такие как /users/:id, отображались как пользователи/постоянная ссылка вместо пользователей/1. Я попытался использовать этот :id в своей области, но он конфликтует с параметром :id foo и все ломает. Может быть, есть связь с путями, которые мне не хватает?

Спасибо за любые предложения, которые у вас могут быть!


person Micah Alcorn    schedule 26.02.2011    source источник
comment
Встроенное вспомогательное решение пути и метод to_param.   -  person Micah Alcorn    schedule 28.02.2011


Ответы (1)


Вы пытались использовать метод to_param в своей модели? Это позволит вам переопределить значение по умолчанию и использовать что-то другое, кроме id, и будет работать с помощниками URL.

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param

Пример из документации:

class User < ActiveRecord::Base
  def to_param  # overridden
    name
  end
end

user = User.find_by_name('Phusion')
user_path(user)  # => "/users/Phusion"

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

person johnmcaliley    schedule 26.02.2011