Rails:将数据传递给javascript

Tom*_*Tom 20 javascript ruby-on-rails

我是Rails的新手,在控制器中我有:

class PagesController < ApplicationController
   def home
      @temp = "Hello"
   end
end
Run Code Online (Sandbox Code Playgroud)

我已经读过,我必须将javascript代码放在application.js中(告诉我,如果是),我有:

window.onload=function(){alert("<%= j @temp %>")}
Run Code Online (Sandbox Code Playgroud)

显然警告打印字符串"<%= j @temp%>"如何将变量@temp传递给javascript,以便警报可以打印Hello?

谢谢

Pow*_*ers 57

我写了一篇关于如何将Ruby对象传递给客户端的文章.Ryan Bates 在将数据传递给JS方面也有出色的RailsCast.

在视图中添加一个div,它与您在加载页面时不可见的PagesControlle #home操作相对应,但将包含存储在Ruby对象中的数据:

# views/pages_controllers/home.html.erb
<%= content_tag :div, class: "temp_information", data: {temp: @temp} do %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

加载包含此div的页面并查看页面源.您可以看到存储在.temp_informationdiv 中的Ruby对象.打开JavaScript控制台以将JavaScript对象作为JavaScript对象访问:

$('.temp_information').data('temp')
Run Code Online (Sandbox Code Playgroud)

您不需要将JS添加到JS部分,也可以使用资产管道.


dee*_*our 5

我做了类似的事情,但比gon简单.我有以下内容ApplicationController.

def javascript_variables(variables)
  @javascript_variables ||= {}
  @javascript_variables.merge!(variables)
end
Run Code Online (Sandbox Code Playgroud)

在控制器动作中,我可以做类似的事情

def some_action
  javascript_variables(user: current_user)
end
Run Code Online (Sandbox Code Playgroud)

在我,ApplicationHelper我有这样的事情

def javascript_variables(variables = nil)
  @javascript_variables ||= {}
  @javascript_variables.merge!(variables) and return if !variables.nil?

  output  = ''
  padding = @javascript_variables.keys.group_by(&:size).max.first

  @javascript_variables.each do |variable, value|
    output << "#{variable.to_s.ljust(padding)} = #{value.to_json},\n          "
  end

  raw "var " + output.strip.html_safe.gsub(/\,\Z/m, ';')
end
Run Code Online (Sandbox Code Playgroud)

最后在我的布局中<head>我有

<script>
  <%= javascript_variables %>
</script>
Run Code Online (Sandbox Code Playgroud)

这给了我这样的东西(从我的应用程序中的一个真实的例子)

<script>
  var pageModule        = "site/index",
      isCustomer        = false,
      utype             = "normal",
      isAnonymous       = true,
      keyboardShortcuts = false,
      pubnub            = null,
      requestToken      = "3zj974w074ftria3j";
</script>
Run Code Online (Sandbox Code Playgroud)

  • 您不应该创建这么多全局变量.而是创建单个对象并将值存储为其属性. (3认同)

归档时间:

查看次数:

37793 次

最近记录:

12 年 前