web-dev-qa-db-fra.com

Rails: transmettre 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 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

17
Tom

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.

54
Powers

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>
5
deefour

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