【问题标题】:Passing ActionView::Helpers::FormBuilder to a partial将 ActionView::Helpers::FormBuilder 传递给部分
【发布时间】:2011-11-08 12:35:59
【问题描述】:

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

最后说明:

我试图实现这个:AJAX update of accepts_nested_attributes_for partials

【问题讨论】:

    标签: ruby-on-rails forms ruby-on-rails-3.1 actionview formbuilder


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        在控制台中试试这个:

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

        【讨论】:

        • 谢谢 Alexandre,我知道这是可行的,但如果我可以使用 FormBuilder 以建议的方式完成,我的功能将大大受益。
        • 这是在 Rails 2.3 还是 3+ 中?不确定Rails 3 中是否存在@template 变量。在您提到的AJAX 更新帖子中,自从发布该方法以来,我已经更改了代码。最后,我使用了 media.pragprog.com/titles/fr_arr/multiple_models_one_form.pdf 的修改版本,而不是抓取现有索引并增加它(它很容易中断,特别是如果我想将嵌套扩展到另一个级别)。
        • 您好粘贴,这是 rails 3.1。感谢您的 cmets 和链接。我尝试使用 view_context 而不是 @template 来实现您的解决方案,它以下列方式中断:NameError: undefined local variable or method `view_context' for main:Object
        猜你喜欢
        • 2011-01-29
        • 2012-05-21
        • 1970-01-01
        • 2020-08-14
        • 1970-01-01
        • 1970-01-01
        • 2020-05-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多