2010-04-16 82 views
6

我在Ryan Bates的railscast站點找到了這個,但不知道它是如何工作的。對方法定義感到困惑:def req =(request)

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

我看到他節省了用戶的IP,用戶代理和引用,但我迷茫與req=(request)線。

回答

6

爲了擴大Karmen Blake's answerKandadaBoggu'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對象是第一個(也是唯一的)參數。

這是有效的,因爲在Ruby中,函數可以使用或不使用圓括號。

+0

感謝您的回答。但user_ip,user_agent,referrer是註釋db表的一部分,就像comment.title,comment.body etc/so爲什麼使用@ blog.user_ip? – 2010-04-16 05:59:16

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=的方法。最後的=字符使它成爲一種賦值方法。

這是一個常規setter方法:

def foo(para1) 
    @foo = para1 
end 

setter方法可以被重新寫爲一個分配方法如下:在兩個setter方法之間

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

感謝您的詳細解答。 – 2010-04-16 06:00:19