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');