2011-11-29 25 views
12

Tôi có ứng dụng Rails 3.1 sử dụng codebrew/backbone-rails. Trong mẫu .jst.ejs, tôi muốn bao gồm hình ảnh, như vậy:Rails với backbone-rails: người giúp đỡ tài sản (image_path) trong các tệp EJS

<img src="<%= image_path("foo.png") %>"/> 

Nhưng tất nhiên những người trợ giúp tài sản không có sẵn trong JavaScript.

Chaining ERB (.jst.ejs.erb) không hoạt động, vì cú pháp EJS mâu thuẫn với ERB.

Dưới đây là những gì tôi biết:

  • Các người giúp đỡ tài sản không có sẵn trong trình duyệt, vì vậy tôi cần phải chạy chúng trên phía máy chủ.
  • Tôi có thể giải quyết vấn đề bằng cách làm cho máy chủ kết xuất các đường dẫn nội dung khác nhau vào HTML (thông qua các thuộc tính dữ liệu hoặc <script> và JSON) và đọc chúng trở lại trong JS, nhưng điều này có vẻ khá kludgy.

Có cách nào bằng cách nào đó sử dụng trình trợ giúp nội dung trong tệp EJS không?

+0

Bạn cũng có thể xác định lại EJS thẻ (nếu chúng thực sự là một cổng chức năng khuôn mẫu của Underscore như được đề xuất trong tài liệu đá quý ruby-ejs) với '_.templateSettings' [chức năng mẫu underscore.js] (http://documentcloud.github.com/underscore/#template), do đó cho phép bạn sử dụng '{{code}}' hoặc một số gắn thẻ khác bạn chọn – wulftone

Trả lời

25

Có một cách, thực sự, để chuỗi một tệp .jst.ejs.erb, mặc dù nó khá không có giấy tờ, và tôi chỉ tìm thấy nó thông qua việc xem xét các trường hợp kiểm tra EJS. Bạn có thể yêu cầu EJS sử dụng {{}} (hoặc [%%] hoặc bất kỳ thứ gì bạn muốn) thay vì <%%>, và sau đó ERB sẽ không cố gắng đánh giá các cuộc gọi EJS của bạn.

Đảm bảo yêu cầu EJS ở đâu đó trong mã của bạn (Tôi chỉ bao gồm gem 'ejs' trong Gemfile), sau đó tạo trình khởi tạo (tôi gọi nó là ejs.rb) bao gồm những điều sau đây:

EJS.evaluation_pattern = /\{\{([\s\S]+?)\}\}/ 
EJS.interpolation_pattern = /\{\{=([\s\S]+?)\}\}/ 

Sau đó, chỉ cần đảm bảo để đổi tên các mẫu của bạn để .jst.ejs.erb, và thay thế hiện <%%> Mã EJS-giải thích của bạn với {{}}. Nếu bạn muốn sử dụng một cái gì đó khác hơn {{}}, hãy thay đổi các biểu thức chính quy trong bộ khởi tạo.

Tôi muốn có một tùy chọn trong Sprockets để xử lý thông qua cấu hình thay vì phải bao gồm rõ ràng EJS, nhưng tại thời điểm này, không có cách nào để làm điều đó mà tôi biết.

+0

Đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn bạn rất nhiều vì đã đăng bài :) – Kirk

+0

hmm điều này không hiệu quả đối với tôi, có tôi đã khởi động lại đường ray. nó chỉ đơn giản là bỏ qua tùy chọn và tiếp tục làm việc với đánh giá mặc định/nội suy – zanedev

+0

@zanedev bạn đã đặt tùy chọn ở đâu? bạn có thể tạo ra một ý chính không? – carpeliam

16

Tôi có thể thấy hai cách. Không tuyệt vời.

Khi bạn nói <%%= variable %> thì đây được đưa ra bởi ERB như <%= variable %>, vì vậy bạn có thể tăng gấp đôi phần trăm thoát khỏi tất cả mọi thứ nhưng các asset_tags và đó sẽ sống sót trong chuyến du lịch thông qua một ERB vượt qua trên đường đến EJS.

Nếu bạn thấy quá thô ...

Làm cách nào để tạo một tệp javascript khác, với tiện ích mở rộng ERB, xác định đường dẫn nội dung của bạn? Và sau đó sử dụng đường ống nội dung để yêu cầu điều đó.

Vì vậy, nói assets.js.erb định nghĩa cái gì đó như:

MyAssets = { 
    'foo': <%= image_path("foo.png") %>, 
    ... 
} 

Và sau đó yêu cầu này ở đâu đó gần phía trên cùng của biểu hiện của bạn. Và sau đó tham khảo các globals tuy nhiên hoạt động trong EJS.

+0

lựa chọn tốt nhất cho đến nay MyAssets một, đi cho nó (cũng cho i18n) – mateusmaso

4

Ryan Fitzgerald đã được loại, đủ để viết ý chính của những người giúp đỡ tài sản JavaScript của mình (mà có được biên dịch sẵn với ERB): https://gist.github.com/1406349

+0

Đó là một ý tưởng tuyệt vời. Cảm ơn vì đăng. – maxl0rd

+0

Gist đó thật tuyệt vời. Đây là ngã ba đơn giản của tôi: https://gist.github.com/3879730 –

5

Đối với những người sẵn sàng thử HAML thay vì EJS: Sử dụng haml-coffee qua haml_coffee_assets đã làm việc tốt cho tôi cũng.

Bạn có thể có những điều sau đây trong một file .hamlc.erb:

%img(src="<%= image_path('foo.png') %>") 

(. Nó vẫn không cung cấp cho bạn định tuyến những người giúp đỡ tuy nhiên, chỉ những người giúp đỡ tài sản)

+0

tuyệt vời, cảm ơn bạn – Hannes

2

Bạn có thể sử dụng tương ứng javascript helper qua viên ngọc sau: https://github.com/kavkaz/js_assets

Cuối cùng (sau khi cài đặt và cấu hình), bạn sẽ có thể sử dụng nó như thế này:

<img src="<%= asset_path("foo.png") %>"/> 
Các vấn đề liên quan