Rails: passer des données à javascript

Je suis nouveau dans Rails et dans un contrôleur, j'ai:

class PagesController < ApplicationController def home @temp = "Hello" end end 

J'ai lu que je devais mettre le code javascript dans application.js (dis moi si vrai) et j'ai:

 window.onload=function(){alert("<%= j @temp %>")} 

De toute évidence, cette alerte permet d'imprimer la chaîne "<% = j @temp%>" Comment puis-je passer la variable @temp au javascript afin que l'alerte puisse imprimer Hello?

Merci

J'ai écrit un article sur la façon de transmettre des objets Ruby au client . Ryan Bates a également un excellent RailsCast pour transmettre des données à JS .

Ajoutez un div à votre vue qui correspond à votre action locale PagesControlle # qui ne sera pas visible lorsque vous chargez la page mais contiendra les données stockées dans les objets Ruby:

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

Chargez la page avec ce div inclus et affichez la source de la page. Vous pouvez voir vos objets Ruby stockés dans la .temp_information . Ouvrez la console JavaScript pour accéder aux objets Ruby en tant qu'objets JavaScript:

 $('.temp_information').data('temp') 

Vous n'avez pas besoin d'ajouter votre JS à un JS partiel, vous pouvez également utiliser le pipeline d'actifs.

Je fais quelque chose de semblable, mais plus simple que gon . J'ai le suivant dans mon ApplicationController .

 def javascript_variables(variables) @javascript_variables ||= {} @javascript_variables.merge!(variables) end 

Dans une action de contrôleur, je peux alors faire quelque chose comme

 def some_action javascript_variables(user: current_user) end 

Dans mon ApplicationHelper j'ai quelque chose comme ça

 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 

Et finalement dans la mise en page <head> j'ai

 <script> <%= javascript_variables %> </script> 

Cela me donne quelque chose comme ça (à partir d'un exemple réel dans ma demande)

 <script> var pageModule = "site/index", isCustomer = false, utype = "normal", isAnonymous = true, keyboardShortcuts = false, pubnub = null, requestToken = "3zj974w074ftria3j"; </script> 

Regarde ça.

http://tech.thereq.com/post/17243732577/rails-3-using-link-to-remote-true-with-jquery-ujs

L'un des moyens les plus faciles est d'utiliser le fichier js.erb, où vous pouvez faire des étiquettes ruby ​​pour accéder aux variables que vous avez définies dans l'action du contrôleur.

Vous devez utiliser un bloc response_to dans l'action du contrôleur, en précisant l'action pour pouvoir répondre à javascript.

Items_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 

/views/items/action.js.erb

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