псевдонимы маршрутизации - PullRequest
6 голосов
/ 15 апреля 2011

У меня есть модель с именем Spaces, в которой есть разные типы мест ... например, бары, рестораны и т. Д. В ней есть те же столбцы, что и в модели, контроллере и т. Д. Нет причудливых STI, у меня просто однаполе с именем Space_type, которое я хотел бы определить для псевдонима.

Вместо domain.com/spaces/12345 это будет /bars/12345 или /clubs/12345

В настоящее время у меня есть:

  resources :spaces do
    collection do
      get :update_availables
      get :update_search
      get :autocomplete
    end
    member do
      post :publish
      post :scrape
    end
    resources :photos do
      collection do
        put :sort
      end
    end

    resources :reviews
  end

Кроме того, есть ли способ, которым я могу сделать это, чтобы каждый раз, когда я использую space_url, он мог выяснить, какой использовать?

Ответы [ 2 ]

6 голосов
/ 15 апреля 2011

Маршруты не способ напрямую взаимодействовать с вашей моделью.Таким образом, пока вы пишете стандартный маршрут, вы можете заставить все работать.Например, чтобы сделать /bars/12345 и /clubs/12345 для вашего spaces_controller (или любого другого имени контроллера), вы можете создать маршруты вроде:

scope :path => '/bars', :controller => :spaces do
  get '/:id' => :show_bars, :as => 'bar'
end  

scope :path => '/clubs', :controller => :spaces do
  get '/:id' => :show_clubs, :as => 'clubs'
end  
5 голосов
/ 15 апреля 2011
# routes.rb
match "/:space_type/:id", :to => "spaces#show", :as => :space_type

# linking
link_to "My space", space_type_path(@space.space_type, @space.id)

, который будет генерировать эти URL: /bars/123, /clubs/1 ... любой space_type у вас есть

И похоже, что STI Wold делают эту работу немного чище;)

UPD

Также вы можете добавить ограничения, чтобы предотвратить некоторые столкновения:

match "/:space_type/:id", :to => "spaces#show", :as => :space_type, :constraints => { :space_type => /bars|clubs|hotels/ }

И да - это хорошая идея, чтобы поставить этот маршрут в нижней части всех других маршрутов

Вы также можете обернуть его в качестве помощника (и переписать по умолчанию space_url):

module SpacesHelper
  def mod_space_url(space, *attrs)
    # I don't know if you need to pluralize your space_type: space.space_type.pluralize
    space_type_url(space.space_type, space.id, attrs)
  end
end
...