我在Ryan Bates的railscast网站上找到了这个,但不确定它是如何工作的。
#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)
行感到困惑。
答案 0 :(得分:6)
该行定义了一个名为req=
的方法。最后的=
字符使其成为一种赋值方法。
这是一个常规的setter方法:
def foo(para1)
@foo = para1
end
可以将setter方法重写为赋值方法,如下所示:
def foo=(para1)
@foo = para1
end
两个setter方法之间的区别在于调用语法。
作业设定者:
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
答案 1 :(得分: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
对象是第一个(也是唯一的)参数。
这是有效的,因为在Ruby中,函数可以使用或不使用括号。
答案 2 :(得分: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"
VS。
person.name("John Doe")
希望有所帮助。