2013-09-03 2 views
2

У меня есть форма, определены следующим образом:Rails form_for условных параметров

form_for(@model) do |f| 
    # Really a lot happens here 
end 

мне было интересно, если есть способ, которым я могу настроить самую первую строку: form_for(@model)

Сначала я, хотя я мог бы можно использовать вспомогательную функцию:

def my_form 
    if some_condition 
     form_for(@model) 
    else 
     form_for [@model, @nested_model] 
    end 
end 

, а затем вставьте его в форму. Как это:

my_form do |f| 
    # Really a lot happens here 
end 

Но, я получаю "Нет блок не дал" ошибка. Может кто-то указать - почему и как это исправить? Может быть, есть другой подход, который я мог бы использовать?

Не спрашивайте меня, зачем оно мне нужно. Просто чтобы все было как можно сухим. Формы должны быть многоразовыми, вы знаете: D

+0

Можете ли вы быть немного более четкое представление о что это за 'some_condition'? Получается ли доступ к какой-либо глобальной информации где-нибудь (вы не передавали ее как параметр)? Вы получили сообщение об ошибке, потому что ваш помощник 'my_form' не предназначен для принятия параметра блока. – lurker

+0

@mbratch Рассмотрим «some_condition» здесь как переменную экземпляра из представления. Или переменная, переданная этому вспомогательному методу. Не имеет значения. Важно то, что я хочу иметь возможность переключаться между «form_for». У меня есть – Dmitri

ответ

2

Вам необходимо передать блок в my_form. Способ сделать это, чтобы включать в себя yield, где вы хотите блок пойти:

def my_form 
    if some_condition 
     form_for(@model) { |f| yield f } 
    else 
     form_for [@model, @nested_model] { |f| yield f } 
    end 
end 

Это должно взять на себя блок вы передаете на ваш взгляд:

my_form do |f| 
    # Really a lot happens here 
end 
+0

Спасибо вам, любезно! Работает как шарм. Не могли бы вы объяснить, как это работает в принципе? – Dmitri

+1

@Dmitri я немного пояснил. Если вы ищете Google «Блоки Ruby», вы можете найти множество подробностей о различных способах обработки блоков. В противном случае, дайте мне знать, если вы хотите более подробно. – lurker

+0

ОК, спасибо. Взгляните глубже на рубиновые блоки! :) Но все равно. Большое спасибо! – Dmitri

Смежные вопросы