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.erbでは、どこにf来ることができますか?それはそのerbでは本当に定義されていません。

ブラウザはサーバーにそのHTMLを要求する必要はないと思います。代わりに、既存のパーシャルを複製して追加することができます。複製を簡単にするために、部分を_return_item.html.erbDIVでラップすることができます。追加する前に、パーシャルのフィールドの名前を調整する必要がある場合があります。

「 nested_form 」と呼ばれる宝石も選択肢になる可能性があります。

于 2012-10-27T01:21:40.320 に答える
0

@Yanhaoが言ったように、私は他の方法を使用してこの質問を解決しました。undefined local variable or method fjavascriptスニペットをform_forブロックの外に置いたために報告される理由。f見つけられないのは確かですitemappend動的効果を実装するためにjqueryによって提供される@Yanhaoの提案と使用に従いました。最初に、変数のとを見つけることができるように<script>タグを中に入れます。次のコードを使用します。form_forfitem

$(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 に答える