8

我试图在给定某个 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

这应该有效。但是rails给出了以下错误:

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”变量有关。我玩过并接受几乎任何东西,如果打印出来是零。任何帮助,将不胜感激。谢谢

最后说明:

我试图实现这一点:Accepts_nested_attributes_for partials 的 AJAX 更新

4

3 回答 3

5

对于需要在控制器中构建表单构建器的任何人,view_context 仍然可以在那里工作。使用 Rails 4.1.4:

@object = Object.new
@f = ActionView::Helpers::FormBuilder.new(:object, @object, view_context, {})
于 2014-11-02T07:13:05.020 回答
4

在视图中,我发现'view_context' 在 Rails 3.1 中不起作用。而是在创建 FormBuilder 对象时尝试“自我”。

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

于 2011-09-14T16:53:50.957 回答
0

在控制台中试试这个:

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​​ 分开。

于 2011-09-01T19:28:33.297 回答