Rails render_to_string 部分需要表单生成器对象?

Rails render_to_string with partial that requires a form builder object?

我觉得这很简单,我完全想念它..

我有一个 edit.html.erb 文件,里面有类似的东西;

<%= form_for @some_object, html: { autocomplete: "off" } do |f| %>
  <%= render 'form', f: f %>
<% end %>

它引用的 _form.html.erb 文件中有类似的内容;

<%= f.fields_for :some_nested_object, @some_object.some_nested_object.order(:sort_order) do |obj| %>
    foobarbaz form stuff..
<% end %>

我无法更改部分编辑或表格。网站的很大一部分都需要它们。它就是这样,我坚持这样做。

我希望能够使用 f.fields_for 渲染部分表单以串入 json 结果。

def index
  respond_to do |format|
    format.json { render json: { html: render_to_string('/path/to/_form.html.erb',
                                                        layout: false,
                                                        locals: { f: ????????? }
  end
end

但是,我不确定在这种情况下如何分配 f

我觉得应该类似于

locals: { f: ActionView::Helpers::FormHelper::form_for(@some_object) }

或类似的东西,但这显然行不通。

这个感觉应该很简单,我就是个白痴..

想法? (关于问题,不是我白痴=)

您可以创建 ActionView::Helpers::FormBuilder 的实例:

def index
  f = ActionView::Helpers::FormBuilder.new(
     'object_name', # the scope for the inputs
     object,        # object wrapped by the form builder
     view_context,  # the template where the form builder can call the tag helpers on 
     {}             # options
  )
  respond_to do |format|
    format.json do
      html = render_to_string(
               '/path/to/_form.html.erb',
               layout: false,
               locals: { f: f }
             )
      render json: { html: html } 
    end
  end
end

好的,看看黑客:

def index
  respond_to do |format|

    format.json do
      form_builder = view_context.form_for(@some_object) { |builder| break builder }

      html = render_to_string(
        '/path/to/_form.html.erb',
        layout: false,
        locals: { f: form_builder }
      )
      render json: { html: html } 
    end
  end
end

正在回答(假设它确实有效)请注意,这是一个 hack。这不是我们应该编写代码的方式(即使我们有时不得不这样做),下一步是弄清楚为什么我们必须进行这种黑客攻击。

例如,您是否有机会重新发明 cocoon gem?