Перепутанный определением метода: определение req = (запрос)

Я нашел это в railscast сайте Ryan Bates, но не уверенным, как это работает.

#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) строка.

6
задан BryanH 10 December 2012 в 22:06
поделиться

3 ответа

Основываясь на ответе Кармен Блейк и ответе КандадаБоггу , первое определение метода делает это так, когда выполняется эта строка:

@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 функции можно использовать со скобками или без них.

6
ответ дан 8 December 2019 в 17:19
поделиться

Эта строка определяет метод с именем 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
ответ дан 8 December 2019 в 17:19
поделиться
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")

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

2
ответ дан 8 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: