5

Tôi đang sử dụng Rails 3.2.9. Khi tôi thêm mã CoffeeScript vào một tệp .js.coffee trong thư mục /app/assets/javascripts, tôi nhận được JavaScript kết quả trong tất cả các trang web của mình. Vấn đề là tất cả JavaScript được gói trong:Đặt các lớp và phương thức CoffeeScript/JavaScript có sẵn cho phần còn lại của ứng dụng Rails

(function() { 
    // my code 
}).call(this); 

Vì vậy, mọi phương pháp tôi xác định không hiển thị trong bất kỳ mã CoffeeScript nào khác mà tôi viết trong các tệp khác. Cách thích hợp để viết một tập các lớp và các phương thức CoffeeScript có thể sử dụng lại với Rails là gì?

Trả lời

7

Điều đơn giản nhất cần làm là đặt tên cho tất cả các lớp của bạn. Nếu ứng dụng của bạn được gọi là "ứng dụng", sau đó trong mã khởi tạo của bạn trước khi bất cứ điều gì khác xảy ra:

// Set up the namespace. 
window.app = { } 

và sau đó trong tất cả các tập tin của bạn .coffee:

class app.Pancakes 
    #... 

Sau đó, bạn muốn có một không gian tên toàn cầu và bạn 'd tham khảo tất cả mọi thứ thông qua namespace rằng:

pancakes = new app.Pancakes 

Tương tự như vậy cho các chức năng đơn giản:

app.where_is = (pancakes, house) -> ... 

# And elsewhere... 
x = app.where_is(...) 

Có nhiều cách khác nhau để thiết lập và che giấu một phần không gian tên nhưng tất cả chúng đều là các biến thể trên các vùng tên trên và đơn giản phát độc đáo với đường dẫn nội dung Rails.

+0

Vị trí thích hợp để thiết lập không gian tên? application.js? chế độ xem bố cục? –

+0

@at ​​.: bất kỳ nơi nào bị trúng lần đầu sẽ làm. Tôi không chắc liệu nó có tồn tại trong một tệp kê khai 'application.js' nhưng tôi đoán nó sẽ tồn tại. Bạn thậm chí có thể ném nó vào bố cục của bạn trước phần còn lại của các thẻ script của bạn. –

+0

Tôi đã tạo một tệp có '_' ở đầu, như' _my_stuff.js.coffee'. Bằng cách này, nó được nạp trước mọi thứ khác và tôi có thể đặt 'window.app = {}' trước mã khác phụ thuộc vào nó. –

4

Ngoài ra, bạn có thể định nghĩa các lớp trong file coffeescript như thế này:

class this.Person 
    constructor: (attr = {}) -> 
    ... 

Bằng cách đó, các định nghĩa được gắn vào không gian tên toàn cầu.

+0

Đây là điều tôi đã tìm kiếm. Tôi đã thực sự khó chịu với Coffeescript tôi đã được đặt tên tất cả mọi thứ với 'window.name = name'. Tôi thường sử dụng Rails 4+ cho hầu hết các ứng dụng, vì vậy Coffeescript chủ yếu là đóng băng trên bánh cho tôi, và điều này làm cho ngày của tôi! –

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