【问题标题】:Undefined form variable when rendering a partial in rails after an AJAX call在 AJAX 调用后渲染部分轨道时未定义的表单变量
【发布时间】:2013-10-15 06:54:04
【问题描述】:

我一直在尝试在 rails 4.0 中使用 AJAX 实现动态依赖表单。我有一个bike 模型has_onemakemodel。它也是has_manyquotes。目标是在选择第一个字段 make 后填充第二个表单的集合字段 (model)。

表单加载正确,一旦选择了第一个字段,就会进行 AJAX 调用,并返回适当的数据集(通过控制台中的 puts 进行确认)。但是,我无法弄清楚如何适当地渲染部分。我收到以下错误。我知道一旦通过 AJAX 调用呈现部分,就没有 f 变量,但是我该如何设计没有 f 变量的表单?

ActionView::Template::Error (undefined local variable or method `f' for #<#<Class:0x007f95b0fc2068>:0x007f95b54e2490>):
    1: <%= f.label :name, 'Model' %>
    2: <% if !current_models.blank? %>
    3:  <%= f.collection_select :name, current_models.collect{ |m| [m.name,m.id]}, :id , :name, include_blank: true %>
    4: <% else %>
  app/views/shared/_model_questions_fields.html.erb:1:in `_app_views_shared__model_questions_fields_html_erb__894239665582553972_70140482609500'
  app/controllers/quotes_controller.rb:70:in `update_model_select'

quotes/new.html.erb

<%= form_for @quote do |f| %>
    <%= f.fields_for :bikes do |builder| %>
            <p><%= render 'shared/bike_questions_fields', :f => builder %></p>
    <% end %>
    <%= f.submit "Show Quote", class: "btn btn-large btn-primary" %>
<% end %>

'shared/bike_questions_fields'

<%= f.fields_for :makes do |builder| %>
    <p><%= render 'shared/make_questions_fields', :f => builder %></p>
<% end %>

<%= f.fields_for :models do |builder| %>
    <div id="bikeModels"
        <p><%= render 'shared/model_questions_fields', :f => builder, :current_models => [] %></p>
    </div>
<% end %>

'shared/model_questions_fields'

<%= f.label :name, 'Model' %>
<% if !current_models.blank? %>
    <%= f.collection_select :name, current_models.collect{ |m| [m.name,m.id]}, :id , :name, include_blank: true %>
<% else %>
    <%= f.collection_select :name, [], :id , :name, include_blank: true %>
<% end %>

引号控制器:

def update_model_select
    models = Model.where(:make_id=>params[:id]).order(:name) unless params[:id].blank?
    render :partial => "shared/model_questions_fields", :locals => { :current_models => models }
end

在quotes.js.coffee:

ready = ->
  jQuery ($) ->

  # when the #make field changes
  $("#quote_bikes_makes_name").change ->

    # make a POST call and replace the content
    make = $("select#quote_bikes_makes_name :selected").val()
    make = "0"  if make is ""
    jQuery.get "/quotes/update_model_select/" + make, (data) ->
      $("#bikeModels").html data

    false


$(document).ready(ready)
$(document).on('page:load', ready)

【问题讨论】:

  • &lt;p&gt;&lt;%= render 'shared/bike_questions_fields', :f =&gt; builder %&gt;&lt;/p&gt;改成&lt;p&gt;&lt;%= render 'shared/bike_questions_fields', locals: { f: builder } %&gt;&lt;/p&gt;?
  • 那行代码不是错误的根源。当通过javascript执行控制器中的render partial代码时会发生错误。

标签: javascript jquery ruby-on-rails ajax forms


【解决方案1】:

我通过将'shared/model_questions_fields' 更改为:

<%= form_for('quote', remote: true) do |f| %>
    <%= f.fields_for :bikes do |g| %>
        <%= g.fields_for :models do |i| %>
            <%= i.label :name, 'Model' %>
            <% if !current_models.blank? %>
                <%= i.collection_select :name, current_models, :id , :name, include_blank: true %>
            <% else %>
                <%= i.collection_select :name, [], :id , :name, include_blank: true %>
            <% end %>
        <% end %>
    <% end %>
<% end %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多