ruby-on-rails - shallow - routes rails examples
Agregar parĂ¡metros adicionales a los recursos de ruta de los rieles (3)
Consulte la documentación de Recursos . Encontrarás esto:
El método de recursos acepta las siguientes opciones para personalizar las rutas resultantes: *: requisitos: establece requisitos de parámetros de enrutamiento personalizado; este es un hash de cualquiera de las expresiones regulares (que deben coincidir para que la ruta coincida) o parámetros adicionales. Por ejemplo:
map.resource :profile, :path_prefix => '':name'', :requirements
=> {: nombre => / [a-zA-Z] + /,: extra => ''valor''}
solo coincidirá si la primera parte es alfabética, y pasará el parámetro: extra al controlador. **
Lo que quiero hacer parece simple, pero podría no ser "apropiado"
digamos que tengo un recurso de imagen, y manipulo la imagen en función de la url. En la url, quiero especificar su tamaño y si está gris, de color o atenuado o alguna otra condición.
actualmente tengo varias rutas con nombre que se ven así.
map.gray_product_image "images/:product/:image/gray/:size.:format", :controller => ''images'', :action => ''gray_product_image''
para mí, el truco es que si creé este uso de los recursos de Rails, no sé cómo especificaría el: tamaño, formato o su "tipo de color".
Supongo que me gustaría agregar una ruta de miembro y especificar mis params como el siguiente.
map.resources :products do |products|
products.resources :images, :member => {:gray_product_image => {'':image/:size.:format'' => :get}}
end
Hay otros momentos en los que he querido agregar información adicional a una ruta de recursos pero no sabía cómo.
Cualquier ayuda sería muy apreciada, gracias.
Me di cuenta de que la forma en que quiero representar mis recursos simplemente queda fuera de los recursos normales de Rails, y eso está bien. El problema que estaba teniendo realmente era que cada vez que agregaba acción antera y ruta nombrada para llegar a lo que quería que se sintiera mal, me estaba repitiendo a mí mismo, tanto en mis rutas como en mis acciones.
Volví simplemente a crear mis rutas con nombre, y pasé un poco más de tiempo en el controlador para poder mantener mis rutas simples. Debajo está lo que tengo ahora, y estoy de acuerdo.
#routes.rb
map.with_options :controller => ''sketched_images'', :action => ''show'', :path_prefix => ''/sketches'', :name_prefix => ''sketched_'', :color => ''grey'' do |m|
m.style "styles/:style/:color/:size.:format"
m.design "designs/:design/:color/:size.:format"
m.product "products/:product/:color/:size.:format"
m.color_combo "colored_products/:color_combo/:size.:format"
end
class SketchedImagesController < ApplicationController
caches_page :show
before_filter :load_data
def show
@size = params[:size] || 100
respond_to do |wants|
wants.png
wants.jpg
end
end
private
def load_data
case
when params[:design]
@image = ClothingDesign.from_param(params[:design]).sketched_image
greyed
when params[:style]
@image = ClothingStyle.from_param(params[:style]).sketched_image
greyed
when params[:product]
@image = Product.from_param(params[:product]).sketched_images.first
greyed
when params[:color_combo]
@color_combo = ColorCombo.find_by_id(params[:color_combo])
@object = @color_combo.colorable
if @object.active? && [email protected]_images.blank?
@image = @object.sketched_images.first
colored
else
@image = @product.style.sketched_image
dimmed
end
end
end
def greyed
@blank = "#FFF"
@print = "#000"
@highlight = "#666"
end
def colored
@blank = "##{@color_combo.blank_color.value}"
@print = "##{@color_combo.design_color.value}"
@highlight = "##{@color_combo.highlight_color.value}" unless @color_combo.highlight_color.blank?
end
def dimmed
@blank = "#BBB"
@print = "#000"
@highlight = "#444"
end
end
No hay una buena manera de eliminar la parte del controlador / id de un recurso. Lo más cerca que vas a conseguir es engañando a ActionController con algo como esto:
map.resources :gray, :path_prefix => "/images/:product/:image_id/",
:controller => ''images'', :requirements => {:colour => "gray"}
Lo cual producirá rutas como www.site.com/images/product/4/gray/1234.html
con el siguiente hash de parámetros:
params => {
:image_id => 4,
:id => 1234,
:colour => "gray",
:product => "product"
}
El formato no se pasará explícitamente, pero estará disponible en el controlador a través de los medios habitualmente respondidos.
A continuación, tendrás que trabajar algo de magia en el controlador para engañar a los rieles y hacer lo que quieras.
class ImagesController < ApplicationController
def show
@size = params[:id]
@image = Image.find(params[:image_id])
...
end
end
En realidad, esto funciona mejor como filtro, por lo que:
class ImagesController < ApplicationController
def initialize_colour
unless params[:colour].nil?
@size = params[:id]
@colour = params[:colour]
@image = Image.find(params[:image_id])
end
end
before_filter :initialize_colour, :except => [:index, :new, :create]
...
end
Sin embargo, para hacer un buen uso de estas rutas, tendrá que pasar todos esos parámetros adicionales a su url para llamadas. Me gusta esto:
gray_url(size, :image_id => @image.id, :product => product)
Pero los ayudantes lo hacen fácil.
module ApplicationHelper
def easy_gray_url(image, size, product)
gray_url(size, :image_id => image.id, :product => product)
end
end