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?
我觉得这很简单,我完全想念它..
我有一个 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?