我为我的第一个模型类型组创建了一个页面,我希望在按下时有一个按钮,在我的项目中(但在不同的视图类别中)显示一个已经存在的表单(html 和嵌入的 ruby)用于填充与组模型关联的新模型。我一直无法让我在网上找到的许多教程都可以使用,并希望在这方面获得进一步的指导。
在得知需要 AJAX 后,我尝试了两种方法。
<%= link_to 'Start Thing', startthing_path, id: 'newThingButton1', :class => 'large success button radius', remote: true, html: {id: 'new_thing_trigger'} %>
<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”中。