0

最初のモデル タイプであるグループのページを作成しました。このボタンを押すと、プロジェクト内の既存のフォーム (html および埋め込みルビー) が表示されます (ただし、別のビュー カテゴリにあります)。グループ モデルに関連付けられた新しいモデル。オンラインで見つけた多くのチュートリアルを機能させることができず、これについてさらに方向性を知りたいと思っていました.

AJAX が必要であることを知った後、2 つのアプローチを試しました。

  1. <%= link_to 'Start Thing', startthing_path, id: 'newThingButton1', :class => 'large success button radius', remote: true, html: {id: 'new_thing_trigger'} %>
  2. <a id="newCampaignButton2" class="large success button radius">New Campaign</a>

私のassets/javascripts/application.group.jsのJavaScriptは次のとおりです。

$(document).ready(function () {
// 1
function () {
    $("#new_thing_trigger").bind("ajax:success", function (evt, data, status, xhr) {
        // this assumes the action returns an HTML snippet
        $("div#newThingFormTab").html(data);
    }).bind("ajax:error", function (evt, data, status, xhr) {
            // do something with the error here
            $("div#errors p").text(data);
        });
}
// 2
$("#newCampaignButton2").on('click', function () {
    //$("#newThingTab").html("<div class='row'><div class='twelve columns centered'><div class='row'><section class='box centered'><div class='banner'><h2 class='text-center'>Start A New Thing!</h2></div><%= form_for @thing, :html => {:multipart => true, :class => 'custom'} do |f| %><% if @thing.errors.any? %><div id='error_explanation'><h2><%= pluralize(@thing.errors.count, 'error') %> prohibited this thing from being saved:</h2><ul><% @thing.errors.full_messages.each do |msg| %><li><%= msg %></li><% end %></ul></div><% end %><%= render :partial => 'form-thing', :locals => { :f => f } %><div class='actions'><%= f.submit 'Launch', :class => 'large success button radius' %></div><% end %></section></div></div></div>');
    $.get('<%= url_for :controller => 'things', :action => 'start' %>', function (data) {
        $('#newThingFormTab').html(data);
    });
    $("#thingSelecter").removeClass("active");
    $("#thingsTab").removeClass("active");
    $("#newThingFormTab").addClass("active");
});

}))

JavaScript の 2 番目のアプローチには、見たい "ハードコードされた" html しかありません。これがベストプラクティスとはほど遠いことはわかっていますが、機能することを望んでいます。数日前、この html をビューにハードコーディングしたとき、部分的な機能がありました。次に<% thing = Thing.new() %>、ボタンを最初にクリックしたときにのみ機能することは明らかです。

誰かが私を助けることができますか?Rails には多くの ajax 機能が組み込まれており、これを行う簡単な方法が必要であることに気付きました。

アップデート

これを尋ねるためのより良い方法を考えました: 別のコントローラーのアクションを呼び出す方法についてのガイダンスを探しています。これは通常、フォームを新しいウィンドウに表示し、そのフォームを別のコントローラーのページの 1 つのコンテナーに表示します。別のアクションを作成する必要があるかどうか、もしそうなら、それがコントローラー「1」または「2」にある必要があるかどうかはわかりません。

4

1 に答える 1

1

erbとjavascriptを混在させないようにします。これが必要になることはめったにありません。使用する場合は、js.erb拡張子を追加する必要があります。

URLヘルパーを呼び出す代わりに、URLを詳しく説明します。

$("#newCampaignButton2").on('click', function () {
  $('#newThingFormTab').load('/things/start.js');
)};

の結果をにロードし/things/start.jsます#newThingFormTab

コントローラーアクションでは、AJAXリクエストのレイアウトのレンダリングをスキップすることができます。そのため、.js拡張機能を追加しました。これにより、アクションはさまざまな形式に異なる方法で応答できるようになります。

def start
  @thing = Thing.new
  respond_to do |format|
    format.html # render start.html
    format.js { render 'start.html', :layout => false }
  end
end
于 2013-03-18T13:35:29.487 に答える