6

我在 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)

4

3 回答 3

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
于 2010-04-16T05:21:15.907 回答
6

为了建立在Karmen Blake 的 answerKandadaBoggu 的 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 中,函数可以带括号也可以不带括号。

于 2010-04-16T05:33:03.770 回答
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")

希望有帮助。

于 2010-04-16T05:19:36.233 回答