【问题标题】:Rails: link_to with remote true and opening it in a new tab or windowRails:带有远程 true 的 link_to 并在新选项卡或窗口中打开它
【发布时间】:2014-06-15 07:45:49
【问题描述】:

我有一个链接,单击该链接将进行 AJAX 调用。此 AJAX 调用将导致显示模式。

= link_to edit_evaluation_path(evaluation), remote: true

但是,当尝试从链接打开一个新选项卡时(例如,通过使用鼠标中键单击它),我收到了 ActionController::UnknownFormat: ActionController::UnknownFormat 错误,因为该操作不希望以 html 响应格式。这是来自相应操作的respond_to 代码:

respond_to do |format|
  format.js
end

如何防止用户在另一个选项卡或窗口中打开链接?我是否有义务将link_to 更改为button_to?谢谢!

【问题讨论】:

    标签: ajax ruby-on-rails-4


    【解决方案1】:

    我已经为我今天运行的这个问题创建了仅 Javascript 的解决方案。

    $.each($("a[data-remote='true']"), function(i, val) {
      $(val).data("url", $(val).attr("href")).attr("href", "javascript:void(0);")
    });
    
    $.rails.href = function(el) {
      var $el = $(el);
      return $el.data('url') || $el.data('href') || $el.attr('href');
    }

    它将直接替换站点上的所有数据远程链接

    【讨论】:

    • 当您在页面上有多个操作时,这不起作用。第二次点击它会抛出GET javascript:void(0); net::ERR_FAILED
    • 我很抱歉上面的评论。问题是远程操作的响应过去也包含此脚本。因此,可以对此进行改进,以识别已更新的 url 字段并跳过它们。
    【解决方案2】:

    我为此设计了一个解决方法。这包括两个步骤:

    判断远程链接目标url的jquery-ujs函数可以被覆盖。因此,我们在检查 href 之前覆盖它以选择数据属性。

    $.rails.href = function(el) {
        var $el = $(el);
        return $el.attr('data-url') || $el.attr('data-href') || $el.attr('href');
    }
    

    接下来,我们创建一个类似于链接的自定义帮助器,它输出数据属性中的 url 而不是 href。

      def pseudo_link_to(name = nil, options = nil, html_options = nil, &block)
        html_options, options, name = options, name, block if block_given?
        options ||= {}
    
        html_options = convert_options_to_data_attributes(options, html_options)
    
        url = url_for(options)
        html_options["data-href".freeze] ||= url
        html_options['href'] = 'javascript:void(0)'
        content_tag("a".freeze, name || url, html_options, &block)
      end
    

    请注意,实际的 href 是 javascript:void(0),即 javascript no-op

    现在,您所要做的就是在 Rails 视图中使用 pseudo_link_to 助手而不是 link_to

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 2019-01-09
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多