Ruby on rails Rails正在尝试远程渲染。。。但不是

Ruby on rails Rails正在尝试远程渲染。。。但不是,ruby-on-rails,ruby-on-rails-3,calendar,Ruby On Rails,Ruby On Rails 3,Calendar,我正在开发一个rails应用程序,并试图将gem下个月的链接转换为ajax响应 我将链接设置为远程: def month_link(month_date) link_to I18n.localize(month_date, :format => "%B"), {:month => month_date.month, :year => month_date.year}, remote: true end 告诉它回复js

我正在开发一个rails应用程序,并试图将gem下个月的链接转换为ajax响应

我将链接设置为远程:

  def month_link(month_date)
    link_to I18n.localize(month_date, :format => "%B"),
      {:month => month_date.month, :year => month_date.year},
      remote: true
  end
告诉它回复js

respond_to do |format|
  format.html
  format.js { render text: "help me!" }
end
而且它有效

Started GET "/calendar/2012/6" for 127.0.0.1 at 2012-07-03 15:27:42 -0500
Processing by CalendarController#index as JS
  Parameters: {"year"=>"2012", "month"=>"6"}
  Event Load (0.3ms)  SELECT "events".* FROM "events" WHERE (('2012-05-27 05:00:00.000000' <= end_at) AND (start_at< '2012-07-01 05:00:00.000000')) ORDER BY start_at ASC
  Rendered text template (0.0ms)
Completed 200 OK in 14ms (Views: 0.7ms | ActiveRecord: 0.3ms)
嗯。。。除了它实际上没有渲染任何东西的部分,我通过了它。如果我只是告诉它在不渲染的情况下格式化.js,它实际上不会响应js文件

什么会导致渲染不显示

更新 我刚刚注意到,如果你像这样访问localhost:3000/calendar/2012/6.js的url,它会按预期工作,所以我认为这是一个如何设置链接的问题

好的,我让js文件工作了,但是我不知道为什么。我想我错过了使用render,尽管我可以发誓我曾经使用过它进行调试。我猜render实际上只在响应html请求时呈现html页面。这是有意义的,因为它将json传递给javascript以用于ajax请求

问题的另一部分是我试图将CoffeeScript与index.js.coffee.erb或index.js.erb.coffee一起使用。我认为它工作时间最长,但真正发生的是,它使用了我首先编写的原始index.js.erb,尽管我已经删除了它。一旦我重新启动服务器,一切都坏了

试试这个:

def month_link(month_date)
  link_to I18n.localize(month_date, :format => "%B"),
  {:remote=>true, :month => month_date.month, :year => month_date.year}
end
您希望使用的链接格式为:

link_to(body, url_options = {}, html_options = {})
:remote=>true希望位于url\u选项中。我不确定:month&:year键是用于什么的,但如果它们是html选项,您可能会想要:

def month_link(month_date)
  link_to I18n.localize(month_date, :format => "%B"),
  {:remote=>true}, 
  {:month => month_date.month, :year => month_date.year}
end

默认情况下,“远程”选项似乎会忽略渲染或重定向的任何尝试。考虑到Ajax的目的是防止这两种情况。。。我明白为什么了

据我所知,在创建远程链接时,会发生以下情况,仅供参考:

jquery_ujs.js的第51行

  $.rails = rails = {
    // Link elements bound by jquery-ujs
    linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote], a[data-disable-with]',
在链接ClickSelector之后,我们在第300行找到了这个函数

  $(document).delegate(rails.linkClickSelector, 'click.rails', function(e) {
    var link = $(this), method = link.data('method'), data = link.data('params');
    if (!rails.allowAction(link)) return rails.stopEverything(e);

    if (link.is(rails.linkDisableSelector)) rails.disableElement(link);

    if (link.data('remote') !== undefined) {
      if ( (e.metaKey || e.ctrlKey) && (!method || method === 'GET') && !data ) { return true; }

      if (rails.handleRemote(link) === false) { rails.enableElement(link); }
      return false;

    } else if (link.data('method')) {
      rails.handleMethod(link);
      return false;
    }
  });
假设handleRemote处理AJAX,我们在第107行找到这个怪物

// Submits "remote" forms and links with ajax
handleRemote: function(element) {
  var method, url, data, crossDomain, dataType, options;

  if (rails.fire(element, 'ajax:before')) {
    crossDomain = element.data('cross-domain') || null;
    dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType);

    if (element.is('form')) {
      method = element.attr('method');
      url = element.attr('action');
      data = element.serializeArray();
      // memoized value from clicked submit button
      var button = element.data('ujs:submit-button');
      if (button) {
        data.push(button);
        element.data('ujs:submit-button', null);
      }
    } else if (element.is(rails.inputChangeSelector)) {
      method = element.data('method');
      url = element.data('url');
      data = element.serialize();
      if (element.data('params')) data = data + "&" + element.data('params');
    } else {
      method = element.data('method');
      url = rails.href(element);
      data = element.data('params') || null;
    }

    options = {
      type: method || 'GET', data: data, dataType: dataType, crossDomain: crossDomain,
      // stopping the "ajax:beforeSend" event will cancel the ajax request
      beforeSend: function(xhr, settings) {
        if (settings.dataType === undefined) {
          xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script);
        }
        return rails.fire(element, 'ajax:beforeSend', [xhr, settings]);
      },
      success: function(data, status, xhr) {
        element.trigger('ajax:success', [data, status, xhr]);
      },
      complete: function(xhr, status) {
        element.trigger('ajax:complete', [xhr, status]);
      },
      error: function(xhr, status, error) {
        element.trigger('ajax:error', [xhr, status, error]);
      }
    };
    // Only pass url to `ajax` options if not blank
    if (url) { options.url = url; }

    return rails.ajax(options);
  } else {
    return false;
  }
},

{:month=>month_date.month,:year=>month_date.year}是传递给索引操作的参数。我的想法是远程可以工作,否则它不会查询数据库,对吗?@mcmullins错了。正在调用该操作。只是没有通过Ajax调用它。@YuriAlbuquerque好吧,它现在正在使用我设置的原始链接。它将响应一个javascript文件,但不响应渲染操作。所以我认为渲染是我的问题。@RadBrad虽然在link_to的文档中没有明确说明,但在它列出的文档中:remote作为一个html选项。这是有意义的,因为它只将数据远程属性添加到html标记中。