В общем, использование исключений для управления потоком программ считается плохой практикой (но это так удобно! = P).
Вместо того, чтобы пытаться явно передать управление от модели к контроллеру, как насчет передачи блока в модель и использования yield для выполнения этого блока. Таким образом, вы можете получить код из контроллера, выполняемого в модели, когда модель хочет, чтобы он был запущен.
hello = "hello"
def func
goodbye = "goodbye"
yield
end
func {hello = "world"}
puts goodbye
NameError: undefined local variable or method `goodbye' for #<Object:0x7fa85b7322a0>
from (irb):25
from :0
puts hello
"world"
Вот пример передачи кода в функцию и демонстрации того, что этот блок кода все еще может обращаться к переменным из вызывающей стороны (привет == "world" из стекового пространства вызывающей стороны, но был запущен изнутри функции). Мне кажется чище.
до свидания, чтобы показать, что переменные, определенные в функции, удаляются из стека после завершения функции.