2011-11-13 35 views
48

Tôi có một bộ điều khiển Rails trong đó tôi đang thiết lập một biến Ví dụ -Làm thế nào để truy cập các biến Ví dụ trong công cụ CoffeeScript bên trong một mẫu Slim

@user_name = "Some Username" 

Trong mẫu .slim của tôi, tôi đang sử dụng động cơ cà phê để tạo javascript và muốn in tên người dùng từ mã javascript của khách hàng -

coffee: 
    $(document).ready -> 
    name = "#{@user_name}" 
    alert name 

Nhưng đây là javascript đang được tạo ??

$(document).ready(function() { 
    var name; 
    name = "" + this.my_name; 
    alert(name); 
} 

Làm cách nào để truy cập các biến đối tượng điều khiển trong mã CoffeeScript của tôi ??

Tôi gắn thẻ này là haml vì tôi đoán haml sẽ gặp vấn đề tương tự khi sử dụng CoffeeScript.

+1

@Thilo Không, anh ấy đang cố gắng tiêm biến Ruby '@ user_name'. Ruby và CoffeeScript sử dụng cú pháp nội suy chuỗi tương tự. –

+1

Tôi hiểu. BTW, làm cách nào để thay đổi tên biến từ '" # {@ user_name} " ' thành 'this.my_name'? – Thilo

+0

Vì trong coffeescript, @prop được biên dịch thành this.prop –

Trả lời

86

Điều đang xảy ra là "#{@user_name}" đang được hiểu là CoffeeScript, không phải mã Ruby được đánh giá và được chèn vào nguồn CoffeeScript. Bạn đang hỏi, "Làm thế nào để đưa một biến Ruby vào nguồn CoffeeScript của tôi?"

Câu trả lời ngắn gọn là: Đừng làm điều này. Nhóm Rails đã quyết định không hỗ trợ CoffeeScript nhúng trong các mẫu trong 3.1, vì có hiệu suất đáng kể khi phải biên dịch CoffeeScript trên mọi yêu cầu (như bạn phải làm nếu bạn cho phép các chuỗi tùy ý được đưa vào nguồn) .

Lời khuyên của tôi là để phục vụ các biến của Ruby của bạn riêng biệt như tinh khiết JavaScript, và sau đó tham khảo các biến từ CoffeeScript của bạn, ví dụ .:

javascript: 
    user_name = "#{@user_name}"; 
coffee: 
    $(document).ready -> 
    name = user_name 
    alert name 
+0

cảm ơn câu trả lời của bạn, vì vậy về cơ bản những gì bạn đã đề xuất là ok từ quan điểm hiệu suất? – kapso

+2

Điều đó phụ thuộc vào việc Slim biên dịch lại CoffeeScript trong mẫu trên mọi yêu cầu hay không. Tôi thực sự không chắc chắn. Có lẽ bạn nên chuyển nó sang một tệp bên ngoài; sau đó nó sẽ chỉ được biên dịch sang JS một lần, và các trình duyệt sẽ lưu nó lại. –

30

Tôi có xu hướng tránh javascript inline bằng mọi giá.

Cách tốt nhất để lưu trữ các biến trong HTML của bạn, được sử dụng từ javascript của bạn, là sử dụng thuộc tính dữ liệu HTML5. Điều này lý tưởng để giữ javascript của bạn không phô trương.

+0

Điều đó sẽ không hữu ích nếu bạn đang sử dụng JavaScript MVC và muốn tránh thực hiện nhiều yêu cầu HTTP đến máy chủ. http://backbonejs.org/#FAQ-bootstrap – jackyalcine

+0

Nếu bạn đang sử dụng javascript MVC, bạn chủ yếu làm các yêu cầu ajax để lấy dữ liệu và hiển thị html trên máy khách. Nhưng ví dụ, thông số cấu hình chung bạn vẫn có thể gửi một lần trong thuộc tính dữ liệu trong html/body/container. – nathanvda

+0

Đúng, đúng.Xin lỗi nếu tôi bị phát ban! – jackyalcine

2

Bạn cũng có thể sử dụng:

$(document).ready -> 
    name = <%= JSON.generate @user_name %> 
    alert name 

Điều này là do JSON là một tập hợp con của JavaScript.

+1

Barfs này khó. Hoặc ít nhất là bên trong các tệp .coffee Dashing. –

Các vấn đề liên quan