Смущен определением метода: def req = (request) - PullRequest
6 голосов
/ 16 апреля 2010

Я нашел это на сайте 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, user agent и реферер пользователя, но запутался в строке req=(request).

Ответы [ 3 ]

6 голосов
/ 16 апреля 2010

Эта строка определяет метод с именем req=. Символ = в конце делает его методом присваивания.

Это обычный метод установки:

def foo(para1)
  @foo = para1
end

Метод установки может быть переписан как метод назначения следующим образом:

def foo=(para1)
  @foo = para1
end

Разница между двумя методами установки заключается в синтаксисе вызова.

Установщик назначения:

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
6 голосов
/ 16 апреля 2010

Чтобы построить ответ Кармен Блейк и ответ KandadaBoggu , первое определение метода делает его таким при выполнении этой строки:

@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 голосов
/ 16 апреля 2010
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")

Надеюсь, это поможет.

...