2013-10-15 4 views
1

Я пытался какое-то время реализовать динамически зависимую форму с использованием AJAX в rails 4.0. У меня есть модель bike, которая has_onemake и model. Это также has_manyquotes. Цель состоит в том, чтобы заполнить поле сбора второй формы (model) после первого поля make.Неопределенная переменная формы при рендеринге частичных рельсов после вызова AJAX

Форма загружается правильно, и вызов AJAX после выбора первого поля производится и возвращает соответствующий набор данных (подтвержденный через puts в консоли). Тем не менее, я не могу понять, как сделать частичное соответственно. Я получаю ошибку ниже. Я понимаю, что нет переменной f, если частичная обработка выполняется через вызов AJAX, но как мне заняться проектированием формы без переменной 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' 

котировки/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 %> 

'совместно/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 %> 

'разделяемые/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) 
+0

Изменение '

<% = 'делают общие/bike_questions_fields',: е => builder%>

'to'

<% = render 'shared/bike_questions_fields', locals: {f: builder}%>

'? – benastan

+0

Эта строка кода не является источником ошибки. Ошибка возникает, когда код «render partial» в контроллере выполняется через javascript. – IkegawaTaro

ответ

0

Я решил, изменив '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 %> 
Смежные вопросы