对方法定义感到困惑:def req =(request)

时间:2010-04-16 05:11:47

标签: 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
def create
    @blog = Blog.new(params[:blog])
    @blog.req = request
    if @blog.save
        ...

我看到他正在保存用户ip,用户代理和引荐来源,但我对req=(request)行感到困惑。

3 个答案:

答案 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 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中,函数可以使用或不使用括号。

答案 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")

希望有所帮助。