我为我的第一个模型类型组创建了一个页面,我希望在按下时有一个按钮,在我的项目中显示已存在的表单(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>
以下是我的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中的第二种方法只有我想看到的“硬编码”html。我知道这远非最佳实践,但我希望看到它有效。几天前,当我将这个HTML硬编码到我的视图中时,我有了部分功能。然后我会使用<% thing = Thing.new() %>
,这显然只在我第一次点击按钮时才有效。
有人能帮助我吗?我注意到rails有很多内置的ajax功能,必须有一个简单的方法来做到这一点。
我想到了一个更好的方式来问这个问题:我寻找有关如何调用另一个控制器操作的指导,这通常会在新窗口中显示一个表单,并在另一个控制器页面上的容器中显示该表单。我不知道是否需要创建另一个动作,如果需要,是否需要在Controller“1”或“2”中。
答案 0 :(得分:1)
我会避免混用erb和javascript,这很少是必要的,如果你想使用它,你需要添加js.erb扩展名
只需拼出网址,而不是调用网址助手:
$("#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