Я нашел это в 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)
строка.
Основываясь на ответе Кармен Блейк и ответе КандадаБоггу , первое определение метода делает это так, когда выполняется эта строка:
@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 функции можно использовать со скобками или без них.
Эта строка определяет метод с именем 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
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")
Надеюсь, что это поможет.