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 dois mettre le code javascript dans application.js (dites-moi si c'est vrai) et j'ai:
window.onload=function(){alert("<%= j @temp %>")}
Évidemment, cette alerte affiche la chaîne "<% = j @temp%>" Comment puis-je transmettre la variable @temp au javascript afin que l'alerte puisse imprimer Bonjour?
Merci
J'ai écrit un article sur comment passer des objets Ruby au client . Ryan Bates a également un excellent RailsCast sur la transmission de données à JS .
Ajoutez à votre vue un div correspondant à votre action PagesControlle # home 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 cette div incluse et affichez le source de la page. Vous pouvez voir vos objets Ruby stockés dans le .temp_information
div. 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 similaire à, mais plus simple que gon. J'ai les éléments suivants dans ma 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 ma 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 enfin dans le <head>
de ma mise en page, j'ai
<script>
<%= javascript_variables %>
</script>
Cela me donne quelque chose comme ceci (tiré d'un exemple réel dans mon application)}
<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 simples consiste à utiliser le fichier js.erb, dans lequel vous pouvez créer des balises Ruby pour accéder aux variables que vous avez définies dans l'action du contrôleur.
Vous devez utiliser un bloc respond_to dans l'action du contrôleur, en spécifiant 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');