2009-11-13 9 views
6

Quello che voglio fare sembra semplice, ma potrebbe non essere "corretta"Aggiungendo params in più alle rotaie risorse instradare

diciamo che ho una risorsa immagine, e io manipolare l'immagine in base alla URL. Nell'URL voglio specificare la sua dimensione e se è grigia, colorata o attenuata o qualche altra condizione.

attualmente ho un numero di percorsi denominati che assomigliano a questo.

map.gray_product_image "images/:product/:image/gray/:size.:format", :controller => 'images', :action => 'gray_product_image' 

per me il trucco è che se ho creato questo useing risorse Rails, non so come avrei specificare il: dimensioni, Formato, o è "tipo di colore".

Immagino che mi piacerebbe aggiungere un percorso membro e specificare i miei parametri come il seguente.

map.resources :products do |products| 
    products.resources :images, :member => {:gray_product_image => {':image/:size.:format' => :get}} 
end 

Ci sono altre volte in cui ho voluto aggiungere informazioni aggiuntive a un percorso di risorse ma non sapevo come.

Qualsiasi aiuto sarebbe molto apprezzato, Grazie.

+0

Un altro percorso di nome vorrei sostituire è map.cart 'carrello /: ordine',: regolatore => 'ordini',: action => 'show' map.resource: carrello, mi dà '/ carrello' e posso memorizzare il numero in sessione [: ordine], ma che si interrompe se i cookie sono disabilitati. – ToreyHeinz

+0

Posso utilizzare le condizioni ": condizioni - Specificare le condizioni di riconoscimento del routing personalizzato. \ Resources imposta il valore: metodo per i percorsi specifici del metodo." – ToreyHeinz

risposta

0

ho capito che il modo in cui voglio rappresentare le mie risorse cade semplicemente al di fuori delle normali risorse Rails, e questo è ok. Il problema che stavo veramente avendo è stato che ogni volta aggiungevo un'azione e chiamavo route per arrivare a quello che volevo sentisse male, stavo ripetendo me stesso, sia nei miei percorsi che nelle mie azioni.

Sono tornato a creare semplicemente le mie route con nome e ho trascorso un po 'più di tempo nel controller in modo da poter mantenere le mie rotte semplici. Di seguito è quello che ho ora, e io sto bene con esso.

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

Verificare il documentation for Resources. Troverete questo:

Il metodo risorse accetta le seguenti opzioni per personalizzare i percorsi liberati: *: requisiti - impostare i requisiti dei parametri di instradamento personalizzato; questo è un hash di entrambe le espressioni regolari (che devono corrispondere per il percorso da abbinare) o parametri aggiuntivi. Per esempio:

 map.resource :profile, :path_prefix => ':name', :requirements 

=> {: name =>/[a-zA-Z] + /,: extra => 'valore'}

corrisponderà solo se la prima parte è alfabetica e passerà il parametro: extra al controller. **

+0

Giusto, ma come posso aggiungere ': size' alla fine del mio url, ma prima dell'opzione: format – ToreyHeinz

5

Non esiste un modo valido per rimuovere la parte controller/id di una risorsa. Il più vicino si sta andando ad ottenere attraverso ingannando ActionController con qualcosa di simile:

map.resources :gray, :path_prefix => "/images/:product/:image_id/", 
    :controller => 'images', :requirements => {:colour => "gray"} 

che produrrà percorsi come www.site.com/images/product/4/gray/1234.html con il seguente params hash:

params => { 
    :image_id => 4, 
    :id => 1234, 
    :colour => "gray", 
    :product => "product" 
} 

Il formato non saranno passati in modo esplicito ma sarà disponibile nel controller attraverso il solito respond_to significa.

Successivamente dovrai lavorare un po 'di magia nel controller per ingannare i binari nel fare ciò che vuoi.

class ImagesController < ApplicationController 
    def show 
    @size = params[:id] 
    @image = Image.find(params[:image_id]) 
    ... 
    end 
end 

Questo in realtà funziona meglio come un filtro in modo da:

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 

Tuttavia, per fare buon uso di questi percorsi, si sta andando ad avere per passare tutti ai parametri aggiuntivi di vostro URL per le chiamate.Così:

gray_url(size, :image_id => @image.id, :product => product) 

Ma gli aiutanti lo rendono facile.

module ApplicationHelper 
    def easy_gray_url(image, size, product) 
    gray_url(size, :image_id => image.id, :product => product) 
    end 
end 
+0

Questo è utile per pensare a quello che sto provando a fare davvero, e quello a cui sono arrivato è questo .. . non ne vale la pena. – ToreyHeinz

+0

Hai altre due opzioni: scrivi la tua versione di map.resources e o scrivi il metodo che genera un named_routes richiesto. – EmFi

+0

Grazie, per l'input e il tempo nel dare la tua risposta. – ToreyHeinz

Problemi correlati