如何将gon值传递给application.coffee?

时间:2012-03-31 16:30:20

标签: javascript ruby-on-rails ruby-on-rails-3

我正在使用rails gon https://github.com/gazay/gon 从控制器中获取数据易于插入视图中 想要一个想法(只是一个例子):

def show
 gon.alert = "this is an alert"
end

现在在我的show.haml:

:javascript
  alert(gon.alert)

现在我总是可以访问我在控制器操作中设置的gon值,但是如果你想从application.coffee访问gon值那么?

  • 在application.coffee中设置gon.current_user = 1的位置?

2 个答案:

答案 0 :(得分:1)

如果要设置可以从每个控制器操作访问的gon值,并因此始终在application.coffee中可用,则可以在before_filter中设置ApplicationController

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_gon_values

  private

  def set_gon_values
    gon.current_user = 1  # or whatever you want to set here
  end
end

这将在所有控制器上的每个操作之前运行set_gon_values方法。这是有效的,因为所有控制器都继承自ApplicationController

答案 1 :(得分:1)

以下是第一个问题的答案:application.coffee中没有什么特别之处,它无论如何都会编译成javascript。只需确保您在DOM Ready事件中访问gon.some_variable

$->
  alert gon.alert

但是接下来你将面临另一个问题,如何确定哪个变量属于哪个控制器/动作。此外,如果您渲染另一个控制器/操作,gon.alert将是未定义的。

因此,您需要在application.coffee中设置条件,该条件仅在特定页面(控制器/操作)上执行。例如,您可以依赖于检测元素ID:

$->
  if $('#pages_controller_show').length
    alert gon.alert 

当然,您的show.haml必须包含id="pages_controller_show"元素。