0

我在使用 AJAX 更新包含nested_attributes_for 表单的部分时遇到问题。

我的应用程序需要根据在主表单中选择的事件类型加载表单的新部分。与每种类型关联的字段存储在数据库表中。

目前,当我选择事件类型时,事件类型的 id 通过远程函数传递给事件控制器。(下面的代码)

<%= event_form.collection_select :type_id, Type.find(:all, :order => "event_type"), :id, :event_type, { :prompt => 'Select Event Type' }, { :onchange => 
  remote_function(
     :url => event_specifics_events_path,
     :with => "'type=' + encodeURIComponent(value)" ), } %>

这会将我的 id 成功发送到控制器,然后控制器搜索与事件类型 id 关联的所有字段,然后用包含附加字段的部分替换空 div(“具体”的 id)。(下面的代码)

    def event_specifics
    # Catch passed variable and search for event fields by event type id
    selected_type = params[:type]

    @event_fields = EventField.type_id_equals(type)

    if @event_fields
        render :update do |fields|
            fields.replace_html 'specifics', :partial => 'event_specifics', :locals => { :event_form => event_form, :event_fields => @event_fields }
        end
    end
end

我的部分代码如下:

<% if @event_fields %>
<hr 100%>

<% event_form.fields_for :event_specifics do |specifics| %>
    <% for field in @event_fields %>
        <% if field.field_type == "check_box" %>
            <%=h eval "#{@specifics}.#{field.field_type} 'value', {}, '#{field.field_value}', ''" %><strong><span class="pipe"><label><%=h field.field_label %></label></strong>
        <% elsif  field.field_type == "radio_button"  %>
            <%=h eval "#{@specifics}.#{field.field_type} 'value', '#{field.field_value}'" %><strong><span class="pipe"><label><%=h field.field_label %></label></strong>
        <% else %>
            <p>
                <br /><strong><span class="pipe"><label><%=h field.field_label %></label></span><span style="color:#E81E57;">*</span></strong><br />
                <%=h eval "#{@specifics}.#{field.field_type} 'value'" %>
            </p>
        <% end %>
    <% end %>
<% end %>
<% end %>

当我尝试运行它时,我收到一个错误声明

undefined local variable or method `event_form' for #<ActionView::Base:0x431b2d8>

我尝试将 event_form 构建器传递给 url 并将其视为参数,然后它抱怨它无法在字符串上调用 fields_for。

构建器“event_form”是此处父表单上的构建器:

<% remote_form_for @event, :url => { :controller => "events", :action => "create" } do |event_form| %>

有没有人有任何想法或解决方案可以解决这个问题?提前致谢!

如果它对任何人有帮助,我使用 Ruby 1.8.7 和 Rails 2.3.8 和 Prototype 1.6.0.3。

4

1 回答 1

1

好的,我现在有一个动态表单,我使用 javascript 来构建它。我想我会在这里发布我的解决方案,以防以后有人偶然发现。

获取控制器中的所有事件字段新操作:

@event_fields ||= EventField.all

在部分中,遍历所有字段并按事件类型 id 对它们进行分组,然后遍历分组记录以构建包含字段的 div(其中的 id 只是与字段关联的事件类型 id)。

    <% event_form.fields_for :event_specifics do |specifics| %>
    <% test = @event_fields %>
    <% for field in @event_fields %>
        <div id="<%=h field.type_id %>", style="display:none;", class="specifics_fields">
            <hr 100%>
            <% type_fields = test.select { |t| t.type_id == field.type_id } %>
            <% for type in type_fields %>
                <% if type.field_type == "check_box" %>
                    <%=h eval "specifics.#{type.field_type} 'value', { }, '#{type.field_value}', nil" %><strong><span class="pipe"><label><%=h type.field_label %></label></strong>
                <% elsif  type.field_type == "radio_button"  %>
                    <%=h eval "specifics.#{type.field_type} 'value', '#{type.field_value}'" %><strong><span class="pipe"><label><%=h type.field_label %></label></strong>
                <% else %>
                    <p>
                        <br /><strong><span class="pipe"><label><%=h type.field_label %></label></span><span style="color:#E81E57;">*</span></strong><br />
                        <%=h eval "specifics.#{type.field_type} 'value'" %>
                    </p>
                <% end %>
            <% end %>
        </div>
    <% end %>
<% end %>

选择框:

<%= event_form.collection_select :type_id, Type.find(:all, :order => "event_type"), :id, :event_type, { :prompt => 'Select Event Type' }, { :onchange => "myFunction(this.value);", } %>

JS功能:

function myFunction(value) {
$$('.specifics_fields').each(function(e){
    e.hide();
});
$(value).show();
}

Evenything 然后按预期运行并且非常有效。它真正需要的只是进行一些调整以使 div id 有效(div id 不应该以数字开头 - 容易修复),我可能应该删除测试变量并将其全部移动到帮助程序中而不是清理风景。

我不太喜欢这个解决方案,但我看不到任何其他方式,所以,如果你知道更好,请不要犹豫,提出一种新的方法。

于 2010-10-06T13:58:58.087 回答