Rails:将数据传递给javascript

Rails:将数据传递给javascript,javascript,ruby-on-rails,Javascript,Ruby On Rails,我是Rails新手,在控制器中我有: class PagesController < ApplicationController def home @temp = "Hello" end end class PagesController

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

class PagesController < ApplicationController
   def home
      @temp = "Hello"
   end
end
class PagesController
我已经读到,我必须将javascript代码放在application.js中(如果为真,请告诉我),我已经:

window.onload=function(){alert("<%= j @temp %>")}
window.onload=function(){alert(“”}
显然,该警报会打印字符串“” 如何将变量@temp传递给javascript,以便警报可以打印Hello

谢谢

我写了一篇关于的文章。瑞安·贝茨也有着出色的表现

在视图中添加一个div,该div对应于PagesControl#home操作,该操作在加载页面时不可见,但包含存储在Ruby对象中的数据:

# views/pages_controllers/home.html.erb
<%= content_tag :div, class: "temp_information", data: {temp: @temp} do %>
<% end %>

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

我做了一些类似的事情,但比简单。我的
应用程序控制器中有以下内容

def javascript_variables(variables)
  @javascript_variables ||= {}
  @javascript_variables.merge!(variables)
end
在控制器操作中,我可以执行以下操作

def some_action
  javascript_variables(user: current_user)
end
在我的
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
def javascript_变量(变量=nil)
@javascript|u变量| |={}
@javascript_variables.merge!(变量)并返回if!变量。零?
输出=“”
padding=@javascript_variables.keys.group_by(&:size).max.first
@javascript|u变量。每个do|变量,值|
输出看看这个

最简单的方法之一是使用js.erb文件,您可以在其中使用ruby标记来访问在控制器操作中定义的变量

您需要在控制器操作中使用respond_来阻止,指定能够响应javascript的操作

项目\u controller.rb

class ItemsController < ApplicationController

  def action
    respond_to do |format|
      format.js
      #format.html {}    #  These are for allowing other types of formats to be responded to.
      #format.json {}    #  But they are not necessary for using this js.erb way of doing things.
    end
  end

end
$(div).html('The cat has erased your page');

这种方法是否会使网站更容易受到攻击?我不确定这是一个问题还是一个陈述,所以我不确定如何回答。你不应该创建这么多全局变量。相反,创建单个对象并将值存储为其属性。您的方法很好,但如果没有从控制器传递的javascript变量,则助手的代码会导致错误。正确的代码是
@javascript_variables | |={}\n@javascript_variables.merge!(变量)如果!变量。零\n如果@javascript_variables=={}
我使用
\n
只是在注释中拆分代码行,则返回。这些解决方案是否有效?可能重复,或者不需要外部Js文件。您的答案对我有效。谢谢
<script>
  var pageModule        = "site/index",
      isCustomer        = false,
      utype             = "normal",
      isAnonymous       = true,
      keyboardShortcuts = false,
      pubnub            = null,
      requestToken      = "3zj974w074ftria3j";
</script>
class ItemsController < ApplicationController

  def action
    respond_to do |format|
      format.js
      #format.html {}    #  These are for allowing other types of formats to be responded to.
      #format.json {}    #  But they are not necessary for using this js.erb way of doing things.
    end
  end

end
$(div).html('The cat has erased your page');