6

Tengo un modelo llamado Spaces que tiene diferentes tipos de lugares ... como bares, restaurantes, etc. Tiene las mismas columnas, mismo, modelo, controlador, etc. sin ITS de lujo, solo tengo un campo llamado Space_type que me gustaría determinar una ruta con alias.raíles alias de enrutamiento

En lugar de domain.com/spaces/12345 sería /bars/12345 o /clubs/12345

Actualmente tengo:

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 

Además, ¿Hay alguna manera de hacer esto para que en cualquier momento utilizo el space_url puede averiguar qué uno para usar?

Respuesta

6

Las rutas no son una forma de interactuar directamente con su modelo. Por lo tanto, siempre que escriba una ruta estándar, puede hacer que las cosas funcionen. Por ejemplo, para hacer /bars/12345 y /clubs/12345 para sus spaces_controller (o cualquiera que sea el nombre del controlador es), puede crear rutas como:

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
# 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) 

que generará este URLs: /bars/123, /clubs/1 ... cualquier space_type tiene

y parece que ITS wold hacer este trabajo poco más limpio;)

UPD

También se puede agregar restricciones para evitar que algunas colisiones:

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

Y sí - es una buena idea poner esta derrota en la parte inferior de todas las demás rutas

También puede envolverlo un ayudante (y reescribir su defecto 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 
+0

no "/: space_type /: id",: a => "espacios # show",: as =>: space_type interferir con el resto de mis controladores sin relación con los espacios? – holden

+0

No, no lo hará. Acerca de STI, enlace y salida de rutas: http://stackoverflow.com/questions/5246767/sti-one-controller/5252136#5252136 – fl00r

+2

Debe asegurarse de que "/: space_type /: id" esté por debajo de su otro nivel superior declaraciones de recursos en config/routes.rb para que esto no interfiera. Los raíles siempre pueden enrutarse, pero si declara un "recurso: waffles" debajo del emparejador personalizado, alguien puede navegar a "/ waffles/1234" y lo encaminará al controlador de espacios como un tipo de waffle. –