Изменение контекста / привязки / области действия блока ruby ​​(специфичная для Rails form_for) - PullRequest
0 голосов
/ 07 ноября 2011
def form_helper(record, *args, &block)
  options = args.extract_options!
  form_for(record, *(args << options.merge(:builder => builder))) do |f|
    f.hidden_field 'hidden', 'key'
    yield &block
  end
end

Если у меня есть этот помощник, как бы я изменил область действия передаваемого блока, чтобы он оценивался в контексте f?

Так что я мог бы использовать это как:

<%= form_helper @resource, :builder => SomeFormBuilder do |form| %>
   Some stuff
<%- end %>

Но это вывело бы скрытое поле и все остальное, что было в блоке. Поскольку я только добавляю скрытые поля, я не хочу создавать пользовательский конструктор форм, а скорее указываю другой конструктор форм.

1 Ответ

1 голос
/ 08 ноября 2011

Правильный способ сделать это - вызвать блок примерно так: block.call(f) и использовать concat для других полей.

  form_for(record, *(args << options.merge(:builder => builder))) do |f|
    block.call(f)
    concat hidden_field_tag 'key', "#{key}/${filename}"
    concat hidden_field_tag 'AWSAccessKeyId', "#{access_key}"
    concat hidden_field_tag 'acl', "#{acl}"
    concat hidden_field_tag 'success_action_redirect', "#{redirect}"
    concat hidden_field_tag 'policy', "#{policy}"
    concat hidden_field_tag 'signature', "#{signature}"
  end
...