Ruby on rails 混淆方法定义:def req=(请求)
我在Ryan Bates的railscast网站上发现了这个,但不确定它是如何工作的Ruby on rails 混淆方法定义:def req=(请求),ruby-on-rails,railscasts,Ruby On Rails,Railscasts,我在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 d
#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=(请求)
行混淆了
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
希望对您有所帮助。该行定义了一个名为
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
要在和的基础上构建,第一个方法定义在执行此行时这样做:
@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中,函数可以使用括号,也可以不使用括号。谢谢您的回答。但是用户ip、用户代理、推荐人都是comments db表的一部分,就像comment.title、comment.body等/那么为什么要使用@blog.user ip呢?谢谢你的详细回答。
@blog.user_ip = request.remote_ip
@blog.user_agent = request.env['HTTP_USER_AGENT']
@blog.referrer = request.env['HTTP_REFERER']