使用渲染后表单不起作用

时间:2012-12-10 23:02:11

标签: ruby-on-rails ruby activeadmin

我尝试在activeAdmin表单方法中使用render方法,但是在插入渲染之后 在代码中,它停止工作。

form do |f|
    f.inputs I18n.t('sale_header') do
      f.input :client
      f.input :room
    end

    f.inputs I18n.t('sale_items')  do
      render :partial => "form_sale"
    end

    f.inputs I18n.t('totalization') do
      f.input :sub_total, :input_html => { :disabled => :true }
      f.input :discount
      f.input :total_value, :input_html => { :disabled => :true }
    end

    f.buttons
end

插入render方法后,屏幕上只显示form_sale内容。

有任何帮助吗? 谢谢!

4 个答案:

答案 0 :(得分:8)

根据the documentation,在active_admin中自定义表单的正确方法是:

ActiveAdmin.register Post do
  form :partial => "form"
end

然后在你的部分“_form.html.erb”中你应该使用formtastic DSL,如下所示:

 <%= semantic_form_for [:admin, @post] do |f| %>
   <%= f.inputs :title, :body %>
   <%= f.buttons :commit %>
 <% end %>

在网页上明确说明:

If you require a more custom form than can be provided through the DSL, you can pass 
a partial in to render the form yourself.

这意味着,active_admin的DSL有一些轻微的限制。

我使用'render'和'form:partial'完成的所有实验都没有结果。如果您想使用partial,它应该替换所有表单。

答案 1 :(得分:2)

我正在使用form:partial =&gt;在许多情况下“形式”,这绝对是你想要自定义表单的方法。

这个答案在这里并不被认为是正确的答案,但有时候我不想让ERB局部化,我只想在一个几乎完美的AA生成表格中添加一些内容。

对于那些使用此技巧的时间,我使用此初始化程序向AA FormBuilder添加了一个内容方法:

ActiveAdmin::FormBuilder.class_eval do
  def content
    form_buffers.last << with_new_form_buffer do
        yield
    end
  end
end

然后我可以在我的AA表单块中使用f.content():

  form do |f|
    f.content do content_tag(:p, "Hello world!") end
      f.inputs do
        f.input :foo
        f.input :bar
      end
      f.content do content_tag(:p, "Hello world!") end
      f.buttons
    end

答案 2 :(得分:1)

当您致电render时,这实际上会呈现整个回复。假设你试图嵌套这个,试试render_to_string。虽然我不完全确定你在form_sale中有什么,以及这是否是你想要的那个块。

答案 3 :(得分:1)

Qumara是对的。仍然,monkeypatches to active admin_ formtastic dsl bridge是可能的。对我有用的是在config / initializers / active_admin.rb文件中打开ActiveAdmin :: Formbuilder类。我在那里补充道:

class ActiveAdmin::FormBuilder
  include ActionView::Helpers::TagHelper
  def custom_capture_text content
    form_buffers.last << template.content_tag(:li,content.html_safe)
  end

然后你可以写

f.inputs I18n.t('sale_items')  do
  f.custom_capture_text(f.template.render(:partial => "form_sale"))
end

这在activeadmin 0.3到0.5中有效。但要注意。 ActiveAdmin升级可能会破坏它。祝你好运。