Rails 3 трассировка маршрута и / или вложение - PullRequest
2 голосов
/ 26 февраля 2011

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

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

  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, отображались как users / permalink вместо users / 1. Я попытался использовать это: id в своей области видимости, но это конфликтует с параметром foo: id и нарушает все. Может быть, есть связь с путями, которые мне не хватает?

Спасибо за любые ваши предложения!

1 Ответ

3 голосов
/ 26 февраля 2011

Вы пытались использовать метод 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"

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

...