Передача ActionView :: Helpers :: FormBuilder частичному - PullRequest
7 голосов
/ 01 сентября 2011

Я пытаюсь динамически создавать элементы формы с учетом определенного запроса AJAX.

Это мои настройки:

Вид:

    <%= link_to 'Next', check_unique_id_students_path, :remote => true %>

    <div id="guardian_student_details"></div>

Контроллер:

def check_unique_id
    @student = Student.new
    @this_form = ActionView::Helpers::FormBuilder.new(:student, @student, @template, {}, proc{})
  end

JS:

jQuery("#guardian_student_details").html("<%=escape_javascript(render :partial => "student_details", :locals => { :s => @this_form }) %>");

Частичная:

<% puts s.text_field :first_name   %>
<% puts s.field_helpers   %>

В целях отладки я поместил следующие строки в самом начале моей части:

<% puts s.class.to_s %>
<% puts s.object.to_s %>

Это распечатывает:

ActionView::Helpers::FormBuilder
Student

Это должно работать. Однако рельсы выдают следующую ошибку:

ActionView::Template::Error (undefined method `text_field' for nil:NilClass):
1: <% puts s.class.to_s   %>
2: <p>
3: <%= s.text_field :first_name, :class => 'text_input is_empty' %>
4: <%= s.label :first_name %><strong>*</strong> 
5: </p>
6: 

app / views / Students / _student_details.html.erb: 3: in _app_views_students__student_details_html_erb__2485891544130782916_2214680440' app/views/students/check_unique_id.js.erb:2:in _app_views_students_check_unique_id_js_erb__3504800328150418937_2214933160 '

Что означает, что "s" - это NIL, что я проверял всего за 2 строки до этого. У кого-нибудь есть идеи? я не знаю, имеет ли это какое-то отношение к переменной "@template", инициализированной в контроллере. Что я играл с и принимает практически все, и если напечатано ноль. Любая помощь будет оценена. Спасибо

Конечная нота:

Я пытался реализовать это: AJAX-обновление accepts_nested_attributes_for partials

Ответы [ 3 ]

4 голосов
/ 14 сентября 2011

В представлении я обнаружил, что view_context не работает в Rails 3.1. Вместо этого попробуйте 'self' при создании объекта FormBuilder.

s = ActionView :: Helpers :: FormBuilder.new (: студент, @student, self, {}, proc {})

4 голосов
/ 02 ноября 2014

Для тех, кому нужно построить построитель форм в контроллере, view_context все еще работает там. Использование Rails 4.1.4:

@object = Object.new
@f = ActionView::Helpers::FormBuilder.new(:object, @object, view_context, {})
0 голосов
/ 01 сентября 2011

Попробуйте в консоли:

s = ActionView::Helpers::FormBuilder.new(:student, @student, @template, {}, proc{})
s.text_field :first_name

У вас будет та же ошибка.Я думаю, что проблема возникла из-за вашего создания объекта form_builder, даже если я не знаю точной ошибки ...

Ваше решение мне кажется немного сложным.Вы можете попробовать это решение:

#html.erb
<% form_for @student do |f| %>
  <div id='guardian_student_details' class='hide-this-block'>
    <%= render :partial => "student_details", :locals => { :s => f }) %>
  </div>
<% end %>

#js
jQuery("#guardian_student_details").show();

Как правило, я предпочитаю разделять javascript и ruby.

...