0

我为我的第一个模型类型组创建了一个页面,我希望在按下时有一个按钮,在我的项目中(但在不同的视图类别中)显示一个已经存在的表单(html 和嵌入的 ruby​​)用于填充与组模型关联的新模型。我一直无法让我在网上找到的许多教程都可以使用,并希望在这方面获得进一步的指导。

在得知需要 AJAX 后,我尝试了两种方法。

  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>

这是我的资产/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 中的第二种方法只有我想看到的“硬编码”html。我知道这远非最佳实践,但我只想看到它起作用。几天前,当我将此 html 硬编码到我的视图中时,我有部分功能。然后我会使用<% thing = Thing.new() %>显然只在我第一次单击按钮时才有效。

有人能帮我吗?我注意到 Rails 有很多内置的 ajax 功能,并且必须有一个简单的方法来做到这一点。

更新

我想到了一个更好的方法来问这个问题:我正在寻找有关如何调用另一个控制器的操作的指导,这通常会在新窗口中打开一个表单,并将该表单显示在另一个控制器页面上的容器中。我不知道是否需要创建另一个动作,如果需要,是否需要在控制器“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 回答