0

我对此有一个问题:我有一个名为的部分_return_item.html.erb,所以我想反复动态地渲染它。

<%= f.fields_for :return_items, return_item do |item_form| %>
  some_field_input_for_return_item
<%end%>

index.html.erb是这样的:

<%= form_for(@return_request) do |f| %>
  <div id="contact">
    <!-- some_field_input_for_request_contact_info -->
  </div>
  <div id="itemlist">
    <!-- This part is working-->

    <% @return_request.return_items.each do |item| %>
      <%= render :partial => "return_items/return_items", :locals => {:f => f, :return_item => item}%>
      <!-- I_want_to_append_the_partial_here -->
    <%end%>

  </div>
  <%= button_tag("Add New Item", :class=>"addItem" )%>
<%end%>

<script>
  $(document).ready( function () {
    $( '.addItem' ).click(function () {
      $.ajax({
        url: "return_requests/request_new_item",
        data: {
               item_num: ($( '#itemlist' ).children().length)
              },
        dataType: "script"
      })
      return false;
    });
  });
</script>

request_new_item控制器是这样的:

def request_new_item
  @return_item = ReturnItem.new 
end

这是request_new_item.js.erb

 $("#itemlist").append('<%= j render :partial => "return_items/return_items", :locals => {:f => f, :return_item => item } %>');

当我按下按钮addItem时,我希望生成一个新的部分,但实际上,这不起作用。控制台提供错误:

 ActionView::Template::Error (undefined local variable or method `f' for #<#<Class:0x007f5a302232b0>:0x007f5a380afea8>)

更新:我忘了发布模型 return_request.rb::

class ReturnRequest < ActiveRecord::Base
    has_many :return_items, :class_name=>'ReturnItem', :foreign_key=>'RMA_Nmb', :primary_key=>'RMA_Nmb'
    accepts_nested_attributes_for :return_items
end

return_item.rb

class ReturnItem < ActiveRecord::Base
  belongs_to :return_request, :class_name=>"ReturnRequest"
end

那么,任何人都可以解释一下这是怎么发生的,我该如何解决这个问题?谢谢

4

2 回答 2

1

index.html.erb中,变量f被传递到块中,但是在 中request_new_item.js.erbf从哪里来?在那个erb中它真的是未定义的。

我认为浏览器不必从服务器请求那段 HTML。相反,它可以复制现有的部分并附加它。为了便于复制,您可以_return_item.html.erb使用 DIV 将部分包裹起来。在附加之前,您可能需要调整部分字段的名称。

名为“ nested_form ”的 gem 也是一种选择。

于 2012-10-27T01:21:40.320 回答
0

因此,正如@Yanhao 所说,我已经使用其他方式解决了这个问题。它报告的原因是undefined local variable or method f因为我将 javascript 代码段放在了form_for块之外。可以肯定的是,我无法定位fitem。我遵循@Yanhao的建议并使用appendjquery提供的来实现动态效果:首先,我将<script>标签放在里面,form_for这样它就可以找到f变量的and item。我只是使用以下代码:

$(document).ready( function () {
    $( '.addItem' ).click(function () {

       $("#accordion").append('<%= j render :partial => "return_items/return_items", :locals => {:f => f, :return_item => @return_request.return_items.build }%>');

      return false;
    });
  });

这段代码对我来说很完美。再次感谢您的帮助。

于 2012-10-28T00:52:24.670 回答