使用AJAX插入部分表格

时间:2018-10-23 10:37:21

标签: ruby-on-rails ajax simple-form

我在我的应用程序中执行了复杂而繁琐的表单。因此,为了提高性能,我想使用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')

2 个答案:

答案 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">