2013-08-10 35 views
15

Tôi mới trong Rails và trong một bộ điều khiển i có:Rails: truyền dữ liệu để javascript

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

Tôi đã đọc mà tôi phải đặt mã javascript trong application.js (cho tôi biết nếu đúng) và i có:

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

Rõ ràng rằng in cảnh báo chuỗi "<% = j @temp%>" Làm thế nào tôi có thể vượt qua @temp biến javascript để cảnh báo có thể in Xin chào?

Cảm ơn

+0

Did một trong những giải pháp làm việc? – Powers

+0

bản sao có thể có của [Ruby on Rails - Gửi biến JavaScript từ bộ điều khiển sang tệp nội dung Javascript bên ngoài] (http://stackoverflow.com/questions/2721880/ruby-on-rails-send-javascript-variable-from-controller-to -external-javascript) hoặc http://stackoverflow.com/questions/2464966/passing-ruby-variables-to-javascript-function-in-rails-view nếu bạn không yêu cầu tệp Js bên ngoài. –

Trả lời

44

Tôi đã viết một bài viết trên how to pass Ruby objects to the client. Ryan Bates cũng có một xuất sắc RailsCast on passing data to JS.

Thêm một div để xem bạn tương ứng với PagesControlle # nhà hành động của bạn sẽ không được hiển thị khi bạn tải trang nhưng sẽ chứa các dữ liệu lưu trữ trong Ruby đối tượng:

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

tải trang với div này được bao gồm và xem nguồn trang. Bạn có thể thấy các đối tượng Ruby của bạn được lưu trữ trong div .temp_information. Mở bảng điều khiển JavaScript để truy cập các đối tượng Ruby dưới dạng đối tượng JavaScript:

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

Bạn không cần phải thêm JS vào phần JS, bạn cũng có thể sử dụng đường dẫn nội dung.

+1

Câu trả lời của bạn đã hiệu quả với tôi. Cảm ơn ! – Niyanta

5

Tôi làm điều gì đó tương tự, nhưng đơn giản hơn gon. Tôi có những điều sau đây trong số ApplicationController của tôi.

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

Trong một hành động điều khiển sau đó tôi có thể làm một cái gì đó giống như

def some_action 
    javascript_variables(user: current_user) 
end 

Trong ApplicationHelper của tôi, tôi có một cái gì đó như thế này

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 

và cuối cùng trong của <head> Tôi có

bố trí của tôi
<script> 
    <%= javascript_variables %> 
</script> 
.210

này mang lại cho tôi một cái gì đó giống như này (từ một ví dụ thực tế trong ứng dụng của tôi)

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

Có thể là phương pháp này làm cho trang web dễ bị tấn công hơn – dotcomXY

+1

Tôi không chắc đây có phải là câu hỏi hay tuyên bố, vì vậy tôi không chắc chắn cách trả lời. – deefour

+3

Bạn không nên tạo quá nhiều biến toàn cầu. Thay vào đó, hãy tạo một đối tượng đơn lẻ và lưu trữ các giá trị làm các thuộc tính của nó. –

0

Hãy xem này.

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

Một trong những cách đơn giản nhất là sử dụng tập tin js.erb, nơi bạn có thể làm thẻ ruby ​​để truy cập các biến mà bạn định nghĩa trong hành động điều khiển.

Bạn cần sử dụng khối respond_to trong hành động của bộ điều khiển, chỉ định hành động để có thể phản hồi 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'); 
Các vấn đề liên quan