Когда вы определяете маршрут, ключом каждого члена хэша опций является , вызываемый как метод, со значением, передаваемым в качестве аргументов .
Так, когда вы делаете get '/', :auth => :user do ...
метод auth
вызывается с аргументом :user
.Это, в свою очередь, вызывает метод condition
с блоком.
Метод condition
на самом деле определен чуть выше, где вы ссылаетесь на , что является использованием Это.Он выглядит следующим образом:
def condition(name = "#{caller.first[/`.*'/]} condition", &block)
@conditions << generate_method(name, &block)
end
Метод generate_method
преобразует блок в метод с заданным именем, а затем этот метод сохраняется в массиве @conditions
.Содержимое @conditions
затем сохраняется с определением маршрута, а @conditions
очищается и готово к следующему определению маршрута.
В этот момент блок кода, переданный в condition
hasn 'т был казнен.Фактически он был сохранен на потом.
Когда поступает фактический запрос, если путь запроса совпадает с маршрутом, тогда выполняется каждое условие, связанное с этим маршрутом , чтобы проверить, что оновыполнено.В этом примере это когда впервые выполняется redirect '/login' unless user_logged_in?
, поэтому session
будет настроен и session[:user]
будет доступен (или нет, если они не вошли в систему).
Важно понимать, что когда вы передаете блок методу, код в этом блоке не обязательно вызывается сразу.В этом случае код в блоке вызывается только при поступлении фактического запроса.