Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 混淆方法定义:def req=(请求)_Ruby On Rails_Railscasts - Fatal编程技术网

Ruby on rails 混淆方法定义:def req=(请求)

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

我在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=(请求)
行混淆了

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']