shallow rails examples ruby-on-rails resources routing

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