Передача ActionView::Helpers::FormBuilder в партиал

Я пытаюсь динамически создавать элементы формы с учетом определенного запроса 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, что я проверил всего двумя строками ранее. У кого-нибудь есть идеи? я не знаю, имеет ли это какое-то отношение к переменной "@template", инициализированной в контроллере. С которым я играл и принимает практически все, а если напечатано, то ноль. Любая помощь будет оценена по достоинству. Спасибо

Последнее примечание:

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


person jalagrange    schedule 01.09.2011    source источник


Ответы (3)


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

@object = Object.new
@f = ActionView::Helpers::FormBuilder.new(:object, @object, view_context, {})
person d3vkit    schedule 02.11.2014

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

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

person sciguy    schedule 14.09.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.

person Alexandre Butynski    schedule 01.09.2011
comment
Спасибо, Александр, я знаю, что это работает, но моя функциональность значительно улучшилась бы, если бы я мог сделать это предложенным способом с помощью FormBuilder. - person jalagrange; 02.09.2011
comment
Это в Rails 2.3 или 3+? Не уверен, существует ли переменная @template в Rails 3. В сообщении об обновлении AJAX, о котором вы упомянули, я изменил код с тех пор, как опубликовал этот метод. В итоге я использовал модифицированную версию media.pragprog.com/titles/fr_arr/multiple_models_one_form .pdf вместо того, чтобы брать существующий индекс и увеличивать его (он был склонен к поломке, особенно если я хотел расширить вложенность на другой уровень). - person Pasted; 05.09.2011
comment
Здравствуйте, Pasted, это рельсы 3.1. Спасибо за ваши комментарии и ссылки. Я попытался реализовать ваше решение, используя view_context вместо @template, и оно сломалось следующим образом: NameError: неопределенная локальная переменная или метод `view_context' для main:Object - person jalagrange; 08.09.2011