2010-04-16 15 views
6

मुझे यह रयान बेट्स की रेलवेस्टास्ट साइट में मिला, लेकिन यह सुनिश्चित नहीं है कि यह कैसे काम करता है।विधि परिभाषा के बारे में उलझन में: def req = (अनुरोध)

#models/comment.rb 
def req=(request) 
    self.user_ip = request.remote_ip 
    self.user_agent = request.env['HTTP_USER_AGENT'] 
    self.referrer = request.env['HTTP_REFERER'] 
end 

#blogs_controller.rb 
def create 
    @blog = Blog.new(params[:blog]) 
    @blog.req = request 
    if @blog.save 
     ... 

मैं देख रहा हूँ वह उपयोगकर्ता आईपी, उपयोगकर्ता एजेंट और संदर्भ की बचत है, लेकिन req=(request) लाइन के साथ उलझन में हूँ।

उत्तर

6

Karmen Blake's answer और KandadaBoggu's answer पर निर्माण करने के लिए, पहली विधि परिभाषा यह इसलिए जब इस लाइन निष्पादित किया जाता है बनाता है:

@blog.req = request 

यह इसके बजाय ऐसा करने जैसा है:

@blog.user_ip = request.remote_ip 
@blog.user_agent = request.env['HTTP_USER_AGENT'] 
@blog.referrer = request.env['HTTP_REFERER'] 

यह मूल रूप से शॉर्टकट सेट करता है। ऐसा लगता है कि आप केवल एक चर के मान को असाइन कर रहे हैं, लेकिन आप वास्तव में req= नामक एक विधि को कॉल कर रहे हैं, और request ऑब्जेक्ट पहला (और केवल) पैरामीटर है।

यह काम करता है क्योंकि रूबी में, फ़ंक्शंस को बिना किसी कंस्ट्रैस के या उसके साथ उपयोग किया जा सकता है।

+0

आपके उत्तर के लिए धन्यवाद। लेकिन user_ip, user_agent, रेफरर टिप्पणियों db तालिका का हिस्सा हैं, जैसे comment.title, comment.body आदि/तो @ blog.user_ip का उपयोग क्यों करें? –

2
def name=(new_name) 
@name = new_name 
end 

has the same functionality as: 

def name(new_name) 
@name = new_name 
end 

हालांकि, जब तरीकों कॉल करते समय एक छोटे से अच्छे और अधिक प्राकृतिक देख बयान तर्क गुजर के बजाय एक काम का उपयोग कर मिलता है।

person = Person.new 
person.name = "John Doe" 

बनाम

person.name("John Doe") 

आशा है कि मदद करता है।

6

वह पंक्ति req= नामक विधि को परिभाषित करती है। अंत में = चरित्र इसे एक असाइनमेंट विधि बनाता है।

यह एक नियमित रूप से सेटर विधि है:

def foo(para1) 
    @foo = para1 
end 

सेटर विधि एक काम पद्धति के रूप में फिर से लिखा जा सकता है इस प्रकार है: दो सेटर तरीकों के बीच

def foo=(para1) 
    @foo = para1 
end 

अंतर मंगलाचरण में है वाक्य - विन्यास।

असाइनमेंट सेटर:

a.foo=("bar") #valid syntax 
a.foo= ("bar") #valid syntax 
a.foo = ("bar") #valid syntax 
a.foo= "bar" #valid syntax 
a.foo = "bar" #valid syntax 

नियमित सेटर:

a.foo("bar") #valid syntax 
a.foo ("bar") #valid syntax 
a.fo o ("bar") #invalid syntax 
+0

विस्तृत उत्तर के लिए धन्यवाद। –

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