0

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

我有一个 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 %>

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

我希望能够f.fields_for在 json 结果中使用 to 字符串呈现部分表单。

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) }

或类似的东西,但这显然不起作用。

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

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

4

2 回答 2

2

好的,看看这个hacky hack:

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

被回答(假设它实际上正在工作)请注意这是一个黑客。这不是我们应该编写代码的方式(即使我们有时必须这样做),下一步是弄清楚为什么我们必须做这样的黑客行为。

例如,您是否有机会重新发明宝石?

于 2021-05-06T20:51:49.263 回答
1

你可以创建一个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
于 2021-05-06T20:30:01.397 回答