2011-08-27 10 views
5

रेल की नौसिखिया पर रूबी के रूप में, मैं समझता हूं कि "@" और ":" संदर्भों के अलग-अलग अर्थ हैं। मैंने एसओ में this post देखा, जिसमें कुछ मतभेदों का वर्णन किया गया।रुबी - अंतर: परिवर्तनीय और @ variable

  1. @ एक उदाहरण चर को इंगित करता है (जैसे, @my_selection)
  2. : एक उपनाम इंगित करता है (जैसे,: my_selection)

मैं एक स्थिति है जहाँ मैं एक मानक था में भाग एमवीसी पेज, मेरे वेबपैप में अन्य सभी रूपों/पृष्ठों के समान।

NoMethodError in selections#create 
Showing C:/somedir/myapp/app/views/my_selections/index.html.erb where line #16 raised: 
undefined method `my_selection_index_path' for #<#<Class:0x1197e5676>:0x25439c3b> 

:

html.erb झलकी

<%= form_for @my_selection do |f| %> 

route.rb झलकी

resources :my_selections 

जब मैं इस पृष्ठ को देखने का प्रयास, मैं इस त्रुटि मिलती है लाइन 16 फॉर्म स्निपेट शो है ऊपर एन

उसी वेब ऐप में मेरे सभी अन्य रूप/पृष्ठ बिल्कुल उसी तरह से स्थापित किए गए हैं और ठीक काम कर रहे हैं। हालांकि, एक बार जब मैंने पर एआरबी फॉर्म संदर्भ बदल दिया: my_selection, यह त्रुटि समाप्त हो गई और मेरा पृष्ठ सामान्य रूप से व्यवहार किया गया।

सवाल: my_selections और @my_selections सही:

  1. के बीच अंतर की मेरी समझ है?
  2. क्यों स्विच कर रहा है: my_selection मेरी मूल त्रुटि को हल करें?

उत्तर

13

Is my understanding of the difference between :my_selections and @my_selections correct?

नहीं :(

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

उन जगहों पर जहां रेल एपीआई एक आवृत्ति चर के स्थान पर एक प्रतीक स्वीकार करता है, आंतरिक रूप से यह वास्तव में ऐसा कर रहा है:

self.instance_variable_get "@#{my_symbol}" 

जो वास्तव में अनुरोधित आवृत्ति चर का मान देता है।

तो एकमात्र कारण है कि आपको लगता है कि प्रतीक प्रतीक चर के अनुरूप है, क्योंकि कोड जो एपीआई चलाता है, उस तरह से काम करता है। आपके लिए ऐसा करने के लिए एक ढांचे के बिना, कोई सहसंबंध नहीं है।

Why would switching to :my_selection resolve my original error?

for_form(model_instance) एक रूप है जो बना कार्रवाई करने के लिए प्रस्तुत करता है, तो मॉडल उदाहरण न सहेजा गया है, या अद्यतन कार्रवाई करने के लिए है कि क्या मॉडल पहले से ही अपने DB में बाहर निकलने से है उत्पन्न होगा।

नहीं, मुझे नहीं पता कि @my_selection में क्या है, लेकिन जो भी वर्ग है वह मार्गों को ठीक से उत्पन्न नहीं कर रहा है।

resources :my_selections 

एक मार्ग आप इस तरह आह्वान होगा उत्पन्न करेगा:

my_selections_path 

कैसे अपने प्रपत्र my_selection_index_path के लिए एक मार्ग पैदा कर रहा है मुझे यकीन है कि नहीं कर रहा हूँ और यह वास्तव में क्या अपने मॉडल हैं पर निर्भर करता है।

और जब आप इसके बजाय प्रतीक पास करते हैं, और कोई संबंधित इवर नहीं होता है, तो यह रूट पीढ़ी के लिए मॉडल नाम के रूप में उपयोग करता है। my_selections_path का आह्वान करने की कोशिश करके सही चीज़ क्या करेगी, जो सीधे आपके द्वारा पारित प्रतीक पर आधारित है।

+0

मुझे यह देखना होगा कि मेरा मॉडल क्या कर रहा है, लेकिन मैं निश्चित रूप से स्पष्टीकरण की सराहना करता हूं। – JW8

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