2013-08-10 14 views
15

i bin neu in Rails und in einem Controller ich habe:Rails: pass Daten an Javascript

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

Ich habe gelesen, dass ich die Javascript-Code in application.js setzen muss (mir sagen, wenn sie wahr ist) und ich habe:

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

Offensichtlich, dass alert Druck die Zeichenfolge "<% = j @temp%>" Wie kann ich die Variable @temp an die Javascript übergeben, so dass die Alarmmeldung kann drucken Hallo?

Dank

+0

Hat einer dieser Lösungen arbeiten? – Powers

+0

mögliches Duplikat von [Ruby on Rails - Senden einer JavaScript-Variablen vom Controller an eine externe JavaScript-Asset-Datei] (http://stackoverflow.com/questions/2721880/ruby-on-rails-send-javascript-variable-from-controller-to -external-javascript), oder http://stackoverflow.com/questions/2464966/passing-ruby-variables-to-jaskriptar-function-in-rails-view, wenn Sie keine externe Js-Datei benötigen. –

Antwort

44

Ich schrieb einen Artikel über how to pass Ruby objects to the client. Ryan Bates hat auch eine ausgezeichnete RailsCast on passing data to JS.

ein div zu Ihrer Ansicht hinzufügen, die auf Ihre Wirkung PagesControlle # Hause entspricht, die nicht sichtbar ist, wenn Sie die Seite laden, aber die Daten gespeichert in der Ruby-Objekte enthalten:

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

Laden Sie die Seite mit diesem div enthalten und die Seitenquelle anzeigen. Sie können Ihre Ruby-Objekte in der .temp_information div sehen. Öffnen Sie die JavaScript-Konsole auf, um die Ruby-Objekte als JavaScript-Objekte zugreifen:

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

Sie müssen nicht auf Ihre JS zu einem JS teilweise hinzufügen, können Sie auch die Asset-Pipeline verwenden.

+1

Ihre Antwort hat bei mir funktioniert. Vielen Dank ! – Niyanta

5

Ich mache etwas ähnliches, aber einfacher als gon. Ich habe folgendes in meinem ApplicationController.

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

Innerhalb einer Controller-Aktion habe ich dann so etwas wie

def some_action 
    javascript_variables(user: current_user) 
end 

In meinem ApplicationHelper tun kann, ich habe so etwas wie dieses

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 

und schließlich in meinem Layout des <head> Ich habe

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

Das gibt mir so etwas wie diese (von einem realen Beispiel in meiner Anwendung)

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

Ist das möglich, dass diese Methode die Website angreifbarer macht – dotcomXY

+1

Ich bin mir nicht sicher, ob dies eine Frage oder eine Aussage ist, also bin ich mir nicht sicher, wie ich darauf antworten soll. – deefour

+3

Sie sollten nicht so viele globale Variablen erstellen. Erstellen Sie stattdessen ein einzelnes Objekt und speichern Sie Werte als Eigenschaften. –

0

bei diesem einen Blick.

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

Eine der einfachsten Möglichkeiten, um js.erb-Datei zu verwenden, wo Sie ruby-Tags Variablen zuzugreifen tun können, die Sie in der Controller-Aktion definiert.

Sie müssen einen "reply_to" -Block in der Controller-Aktion verwenden, der die Aktion angibt, um auf JavaScript reagieren zu können.

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