Rails:link_to with remote true并在新选项卡或窗口中打开它

sau*_*kko 6 ajax ruby-on-rails-4

我有一个链接,当点击它时,将进行AJAX调用.这个AJAX调用将导致模态出现.

= link_to edit_evaluation_path(evaluation), remote: true
Run Code Online (Sandbox Code Playgroud)

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

respond_to do |format|
  format.js
end
Run Code Online (Sandbox Code Playgroud)

如何阻止用户在另一个选项卡或窗口中打开链接?我有义务改变link_to一个button_to吗?谢谢!

小智 5

我为今天遇到的这个问题创建了仅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');
}
Run Code Online (Sandbox Code Playgroud)

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


lor*_*non 1

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

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

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

接下来,我们创建一个类似于 link to 的自定义帮助器,它在 data 属性中输出 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
Run Code Online (Sandbox Code Playgroud)

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

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