Здесь происходит просто то, что метод form_for
вызывается с обоими параметрами и блоком в одном вызове.
Вот базовый пример того, как метод принимает и параметр, и блок, чтобы проиллюстрироватьпринцип:
def hello(name)
puts "Hello, #{name}!"
yield if block_given?
puts "Goodbye, #{name}!"
end
Этот метод можно вызывать с одним параметром или с параметром и блоком:
> hello("John")
Hello, John!
Goodbye, John!
> hello("John") do
* puts "Inside the block"
* end
Hello, John!
Inside the block
Goodbye, John!
По вопросу в вашем комментарии:
Почему в скобках указывается только первый параметр?После обнаружения открытых + закрытых скобок после form_for, как Ruby узнает, что ему следует «подождать» перед вызовом метода?
Если я правильно понимаю ваш вопрос, вы спрашиваете, почему вокруг круглых скобок@post
в вызове form_for
, а не вокруг всего блока.Это синтаксис для передачи блока методу в Ruby - если блок следует сразу после метода и его обычных параметров, блок передается методу вместе с параметрами.
Вот некоторые изНаиболее распространенные способы вызова метода в Ruby:
# Calling a method without a block
mymethod(param1, param2)
# Same as above, but leaving out parentheses
mymethod param1, param2
# Calling a method with a block that takes no arguments
# (this works without parentheses too)
mymethod(param1, param2) { do_stuff_in_block() }
# or
# (this works without parentheses too)
mymethod(param1, param2) do
do_stuff_in_block()
end
# Calling a method with a block that takes arguments
# (this works without parentheses too)
mymethod(param1, param2) do |arg1, arg2|
do_stuff_in_block(arg1, arg2)
end
# or
# (this works without parentheses too)
mymethod(param1, param2) { |arg1, arg2| do_stuff_in_block(arg1, arg2) }
Посмотрите на Блоки и итераторы в программировании на Ruby для получения дополнительной информации о том, как вызывать методы с блоками и какнапишите свои собственные методы, которые принимают блоки.