如何使用jQuery / AJAX在Ruby on Rails中的不同模型视图中使用其他控制器操作?

时间:2013-03-15 23:17:34

标签: jquery ruby-on-rails-3.2 renderpartial

我为我的第一个模型类型组创建了一个页面,我希望在按下时有一个按钮,在我的项目中显示已存在的表单(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>
  3. 以下是我的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”中。

1 个答案:

答案 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