0

Railsキャストされたネストされたモデルから複雑なフォームを作成しようとしています。プロジェクトとタスクは私が持っている2つの形式です。タスクはプロジェクトに属しています。プロジェクトには多くのタスクがあります。

フォームが正常に作成され、2つのモデル間の関係が正しく表示されます。プロジェクトを破棄すると、プロジェクトに関連付けられているタスクが削除されます。javascriptを使用してタスクを削除したりプロジェクトに追加したりしようとすると、問題が発生します。リンクが正常に作成され、フォームがブラウザに正常に読み込まれ、問題なくフォームを送信できますが、[削除]または[追加]リンクをクリックしても何も起こりません。

ログには何も表示されず、ブラウザにエラーメッセージも表示されません。これが私のapplication.jsと私のapplication_helper.jsとフォームです。

application.js

//= require jquery
//= require jquery_ujs
//= require jquery.ui.all
//= require_tree .
function remove_fields(link) {
    $(link).previous("input[type=hidden]").value = "1";
    $(link).up(".fields").hide();
}
function add_fields(link, association, content) {
    var new_id = new Date().getTime();
    var regexp = new RegExp("new_" + association, "g")
    $(link).up().insert({
        before: content.replace(regexp, new_id)
    });
}

application_helper.js

module ApplicationHelper
    def link_to_remove_fields(name, f)
        f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)")
    end

    def link_to_add_fields(name, f, association)
        new_object = f.object.class.reflect_on_association(association).klass.new
        fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
            render(association.to_s.singularize, :f => builder)
        end
        #link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))
        link_to_function(name, "add_fields(this, '#{association}', '#{escape_javascript(fields)}'')")
    end
end

_form.html.erb

  <p>
     <%= f.label :name, "Name" %>
     <%= f.text_field :name %> <br />
     <%= f.label :description, "Description" %>
     <%= f.text_field :description %> <br />
     <%= f.label :project_id, "Project ID" %>
     <%= f.text_field :project_id %> <br />
     <%= f.label :id, "ID" %>
     <%= f.text_field :id %>
  </p>

  <h3> Tasks for Project </h3>
    <%= f.fields_for :tasks do |builder| %>
      <%= render 'task', :f => builder %>
    <% end %>
    <p><%= link_to_add_fields "Add Task", f, :tasks %>
    <p><%= f.submit "Submit" %></p>

<% end %>

_task.html.erb

<div class="fields"> 
    <%= f.label :name, "Name" %>
    <%= f.text_field :name %></br >
    <%= f.label :description, "description" %>
    <%= f.text_area :description, :rows => 3 %><br />
    <%= link_to_remove_fields "remove", f %>
</div>
4

2 に答える 2

1

jqueryを使用しているので、プロトタイプ関数のparent()代わりにを使用して、をに変更する必要があります。したがって、JavaScriptコードは次のようになります。up()insert()append()

function remove_fields(link) {
  $(link).previous("input[type=hidden]").val(1);
  $(link).parent(".fields").hide();
}
function add_fields(link, association, content) {
  var new_id = new Date().getTime();
  var regexp = new RegExp("new_" + association, "g")
  $(link).parent().append(content.replace(regexp, new_id));
}

しかし、これらすべての厄介なものを自分で書きたくない場合は、nested_formgemを使用できます。複雑なフォルムにぴったりの逸品です。

于 2013-02-27T09:53:19.080 に答える
0

まず、link_to_add_fields行で<p>を終了するのを忘れました

次に、次の行がご使用のバージョンのjQueryによって正しく実行されなかった可能性があります。

$(link).up().insert({
    before: content.replace(regexp, new_id)
});

問題がないことを確認するには、line_to_add_fieldの前にこの行を書き込んでみてください

前の3行を次のように変更します

$('#task_attributes').append(content.replace(regexp, new_id));

これが機能しない場合は、最初のメッセージを更新して、「link_to_add_field」rails関数の生成されたコードを表示します。

于 2013-02-27T09:45:07.560 に答える