我在我的应用程序中执行了复杂而繁琐的表单。因此,为了提高性能,我想使用AJAX方法注入此表单的某些部分。但我无法成功。
为了说明这一点,我举了一个简单的例子=
新事件(查看):
<%= simple_form_for event, remote: true do |f| %>
<%= f.input_field :start_at %>
<div class="">
</div>
<a href="/event_add_user?form=<%=f%>" class="btn" data-method="patch" data-remote="true">
Add user to event
</a>
<div class="form_area"></div>
<% end %>
event_controller(控制器):
def add_user
@form = params[:form]
respond_to do |format|
format.js {render 'add_user'}
end
end
add_user.js.erb(js文件):
$('#event_form_area').append('<%= j render partial: "events/user", locals: {f: @form} %>');
用户(部分):
<%= f.input_field :user_name %>
当前,我遇到此错误:
ActionView :: Template :: Error(““:String”的未定义方法'input')
答案 0 :(得分:2)
您正试图通过参数传递整个表单构建器period_usage=0.2
,我认为这是不可能的。
由于f
只是用于输出某些HTML的辅助方法,因此可以将HTML直接实现为部分HTML。
因此,“事件/用户”部分为:
f.input_field
如果可行,您可以从控制器中删除<input class="string required" id="event_user" maxlength="100" name="event[user]" type="text" value="" />
,从视图中删除@form = params[:form]
哈希,并从AJAX调用中删除locals
,因为不再需要。
input_field reference at rubydoc
您也可以使用form_tag helpers:
?form=<%=f%>
答案 1 :(得分:2)
您正在部分视图中将@form
作为f
传递。 params[:form]
最有可能是一个字符串。以下是解决此问题的一些方法。
1。重新创建表单对象
由于您先前的请求中没有f
对象,因此您可以重新创建该对象以生成html代码段。您可以使用新的params
对象来创建新的表单对象,而不是从Event
中检索表单对象(我认为这是不可能的)。我尚未对此进行过测试,但这应该可以为您提供想法。
def add_user
@event = Event.new
respond_to do |format|
format.js {render 'add_user'}
end
end
将@user
设置为本地人
$('#event_form_area').append('<%= j render partial: "events/user", locals: {event: @event} %>');
然后重新创建表单对象
# partial
<% form_for event do |f| %>
<%= f.input_field :user_name %>
<% end %>
请注意在第一行使用<%
而不是<%=
。我们不想再有一个<form>
元素。
然后,您完成了。此代码应生成html代码段
或 2。使用纯HTML
在您的部分代码中,将代码重写为纯html元素。例如
<input class="form-control" type="text" name="event[user_name]" id="event_user_name">