Изменение контекста/привязки/области действия рубинового блока (форма_for, специфичная для Rails)

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 %>

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


person scottkf    schedule 07.11.2011    source источник


Ответы (1)


Правильный способ сделать это — вызвать блок следующим образом: 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
person scottkf    schedule 08.11.2011