在“beforeunload”上使用jQuery调用rails控制器方法

时间:2012-04-28 05:05:01

标签: javascript jquery ruby-on-rails ajax

当用户离开页面时,我想在控制器中调用一个方法。理想情况下,我还想传递几个参数。

这就是我所拥有的。不确定我是否正确处理参数,我的离开方法永远不会被调用。

在'show.html.erb'

<script language="javascript"> 
    $(window).bind('beforeunload', function() {
    $.get('/leave?foo='+<%= @bar %>, null, null, null)
    });
</script>

在'routes.rb'

match '/leave' to: 'posts#leave'

在'posts_controller.rb'

def leave
  puts params[:bar]
end

注意:将link_to直接放到/leave下工作正常,当用户试图离开时,用$.get替换jQuery return true;会抛出一个对话框。

2 个答案:

答案 0 :(得分:2)

非常接近。假设您的参数类似于:

foo=bar

你的jQuery get变成:

$.get('/leave?foo=bar', null, null, null)

你的路由没有抛出语法错误(抱歉,Rails改变了每个主要版本的路由,所以也许这适用于Rails 2.x但它不在3.x上)。而不是:

match '/leave' to: 'posts#leave'

使用...

match '/leave' => 'posts#leave'

在您的控制器中:

def leave
  puts params[:foo]
end

或者,如果您只想测试参数是否存在:

def leave
  puts params.include?(:foo)
end

答案 1 :(得分:0)

我使用不引人注目的JS解决了这个问题。在我的一个Coffeescript文件中:

jQuery ->
  $(window).on('beforeunload', ->
    $.get('/leave?foo=bar', null)
    return "Bye!")

我想在没有警报的情况下这样做,但除非我返回一些内容,否则GET不起作用。很奇怪,但这是一个单独的问题。

感谢您的帮助,Mark。