2009-11-13 16 views
6

मुझे क्या करना चाहते हैं सरल लगता है रेल के लिए अतिरिक्त परम जोड़ा जा रहा है, लेकिन "उचित"मार्ग संसाधनों

चलो कहते हैं कि मैं एक छवि संसाधन है मत हो सकता है, और मैं यूआरएल के आधार पर छवि हेरफेर। यूआरएल में मैं इसका आकार निर्दिष्ट करना चाहता हूं और चाहे वह भूरा, रंगीन, या मंद हो या कुछ अन्य स्थिति हो।

वर्तमान में मेरे पास कई नामित मार्ग हैं जो इस तरह दिखते हैं। आकार,: प्रारूप है, या यह "रंग प्रकार" है

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

मेरे लिए चाल है कि अगर मैं इस का उपयोग रेल संसाधनों के बन जाने, मैं कैसे मैं में निर्दिष्ट करना होगा पता नहीं है है।

मुझे लगता है कि मैं एक सदस्य मार्ग जोड़ना चाहता हूं और निम्न जैसे मेरे पैराम निर्दिष्ट करना चाहता हूं।

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

ऐसे कई बार हैं जहां मैं संसाधन मार्ग पर अतिरिक्त जानकारी जोड़ना चाहता था लेकिन मुझे नहीं पता था कि कैसे।

किसी भी मदद की सराहना की जाएगी, धन्यवाद।

+0

एक और नामित मार्ग मैं को प्रतिस्थापित करना चाहते है map.cart 'गाड़ी /: आदेश',: नियंत्रक => 'आदेश',: कार्रवाई => 'शो' map.resource: गाड़ी, मुझे देता है '/ कार्ट' और मैं सत्र [: ऑर्डर] में नंबर स्टोर कर सकता हूं, लेकिन कुकीज़ अक्षम होने पर वह टूट जाता है। – ToreyHeinz

+0

क्या मैं शर्तों का उपयोग कर सकता हूं ": शर्तें - कस्टम रूटिंग मान्यता शर्तों को निर्दिष्ट करें। \ संसाधन सेट करता है: विधि-विशिष्ट मार्गों के लिए विधि मान।" – ToreyHeinz

उत्तर

0

मुझे एहसास हुआ है कि जिस तरह से मैं अपने संसाधनों का प्रतिनिधित्व करना चाहते हैं बस सामान्य रेल संसाधनों अवधि से बाहर है, और कहा कि ठीक है। जिस समस्या में मैं वास्तव में था वह था कि हर बार जब मैंने यह जानना गलत महसूस किया कि मैं गलत तरीके से महसूस कर रहा हूं, तो मैं अपने मार्गों और मेरे कार्यों में दोहरा रहा था।

मैं अपने नामित मार्ग बनाने के लिए वापस गया, और नियंत्रक में थोड़ा और समय बिताया ताकि मैं अपने मार्गों को सरल रख सकूं। नीचे मेरे पास अब है, और मैं इसके साथ ठीक हूं।

#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]etched_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

documentation for Resources देखें। आप इस मिल जाएगा:

संसाधनों विधि जिसके परिणामस्वरूप मार्गों को अनुकूलित करने के निम्नलिखित विकल्पों के स्वीकार करता है: *: आवश्यकताओं - कस्टम मार्ग पैरामीटर आवश्यकताएं सेट करें; यह नियमित अभिव्यक्तियों का एक हैश है (जो मैच के लिए मार्ग के लिए मेल खाना चाहिए) या अतिरिक्त पैरामीटर। उदाहरण के लिए:

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

=> {: नाम =>/[a-zA-Z] + /,: अतिरिक्त => 'value'}

केवल तभी पहले से मेल खाएगी भाग वर्णमाला है, और पैरामीटर पारित करेंगे:। नियंत्रक करने के लिए अतिरिक्त **

+0

ठीक है, लेकिन मैं अपने यूआरएल के अंत में 'आकार' कैसे जोड़ सकता हूं, लेकिन इससे पहले: प्रारूप विकल्प – ToreyHeinz

5

एक संसाधन के नियंत्रक/आईडी हिस्से को हटाने के लिए कोई अच्छा तरीका नहीं है। निकटतम कुछ इस तरह के साथ ActionController को धोखा देना के माध्यम से प्राप्त करने के लिए जा रहे हैं:

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

निम्नलिखित में से कौन पैरामीटर हैश के साथ www.site.com/images/product/4/gray/1234.html तरह मार्गों का उत्पादन करेगा:

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

प्रारूप स्पष्ट रूप से नहीं पहुंच पाएगी लेकिन यह आमतौर पर प्रतिक्रिया_to साधनों के माध्यम से नियंत्रक में उपलब्ध होगा।

अगला आपको अपने इच्छित काम करने में रेल की चाल के लिए नियंत्रक में कुछ जादू करना होगा।

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

यह वास्तव में एक फिल्टर इतनी के रूप में बेहतर काम करता है:

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 

हालांकि इन मार्गों का अच्छा इस्तेमाल करने के लिए, आप कॉल के लिए अपने यूआरएल के लिए उन सभी अतिरिक्त पैरामीटर पास करने के लिए जा रहे हैं।इस तरह:

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

लेकिन सहायक इसे आसान बनाते हैं।

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

यह सोचने में मददगार है कि मैं वास्तव में क्या करने की कोशिश कर रहा हूं, और मैं यह क्या कर रहा हूं .. । यह इसके लायक नहीं है। – ToreyHeinz

+0

आपके पास दो अन्य विकल्प हैं: map.resources का अपना संस्करण लिखें और लिखें विधि जो आवश्यक नाम_रूउट उत्पन्न करता है। – EmFi

+0

धन्यवाद, आपके उत्तर देने में इनपुट और समय के लिए। – ToreyHeinz

संबंधित मुद्दे