Select2 rails形成重新填充

时间:2017-09-20 21:52:54

标签: ruby-on-rails ajax select2-rails

我创建了一个带有多个select和collection_select元素的rails(v5)表单。 然后我使用Select2-rails(v4.0.3)来做一个看起来像标签的好选择。 搜索选项由ajax提取。

它可以正常工作,直到按下提交按钮并缺少必填字段。 现在已从字段中删除了有效的字段内容。

让我举一些示例代码:

控制器:

...

def form
    if params[:form_request].nil?
        @form_request = FormRequest.new
    else
        @form_request = FormRequest.new(params[:form_request])
    end
end

def request_form
    @form_request = FormRequest.new(params[:form_request])

    if @form_request.valid?
        render :summary
    else
        render :form
    end
end

...

形式:

...
<%= bootstrap_form_for(@form_request, url: '/form/request_form') do |f| %>
    <%= f.select :field, [], {label: 'Field label'} %>
    <%= f.submit "Submit form" %>
<% end %>

:field肯定是模型中的可写字段(并且数据设置正常)

咖啡脚本:

Query ->
   $("#form_request_from").select2({
       ajax: {
          url: func =(params) ->
             filter = params.term
             return "/data.json?filter=" + filter;
            ,
         dataType: 'json',
         processResults: processData
       },
       theme: 'bootstrap',
       placeholder: 'Enter data here'
  });

processData = (data) ->
    mapdata = $.map(data, func =(obj) ->
        obj.id = obj.id;
        obj.text = obj.name;
        return obj;
    );
    return { results: mapdata };

我正在考虑很多可能性,但最后我不确定现场数据的来源。它位于对象内部,但不以任何方式写入生成的HTML。 即使id被写为选定的选项, select2脚本需要知道如何将其转换为字符串以显示真实数据。

知道如何在验证失败后仍然将数据写入字段吗?

1 个答案:

答案 0 :(得分:0)

在尝试了一些事情后,我发现了如何做到这一点。 起初我只是将空数组更改为:field变量。 这不能很好地工作,因为它只记住之前输入的值的ID,因此SELECT2脚本无法找到该键的值,也没有显示任何内容。

然后我在控制器中创建了一个新变量,我在其中放置了名称和id:

的数组
field_object = ObjectsModel.find(@form_request.field.to_i)
@form_field = []
if !field_object.nil?
    @form_field =  [[field_object.name, field_object.id]]
end

在视图中我现在使用此字段显示可用选项:

<%= bootstrap_form_for(@form_request, url: '/form/request_form') do |f| %>
    <%= f.select :field, @form_field, {label: 'Field label'} %>
    <%= f.submit "Submit form" %>
<% end %>

这对我来说非常好,无需触摸SELECT2脚本。 AJAX仍然可以获取可能的值,但已经填写的字段将在重定向到另一个操作时保留。