2011-09-07 55 views
7

Tôi đang sử dụng Ruby on Rails 3.1 và tôi tự hỏi làm thế nào tôi có thể hiển thị một phần trong nội dung javascript.Hiển thị một phần trong nội dung

Những gì tôi đang hướng tới:

# in /app/assets/javascript/cart.js.coffee.erb 
$('a.add_sth').click -> $('.random_container').append('<%= render partial: 'way/to/partial' %>') 

Điều này gây ra một NoMethodError:

undefined method `render' for #<#<Class:0x007fc54584c6e8>:0x007fc5474cd470> 

Nếu tôi viết <%= 2+3 %> thay vào đó nó hoạt động tốt, btw.

Tôi nghĩ rằng vấn đề là đường dẫn nội dung độc lập với ActionView mặc định và đó là lý do tại sao render() không xác định ở đó. Dù sao, có cách nào để có được nội dung của một phần được hiển thị không?

Trả lời

5

Hãy nhớ rằng tài sản có nghĩa là cho dữ liệu tĩnh như CSS, JS hoặc hình ảnh đó sẽ không tự động thay đổi nội dung của nó, vì vậy họ có thể được lưu trữ tốt hơn và/hoặc xuất sang CDN.

Vì bạn được phép chạy ERB với mã ruby, nên luôn trả về cùng một giá trị (vì nó sẽ chỉ được thực hiện khi biên dịch nội dung).

Đó là lý do tại sao tôi đoán làm cho không có sẵn bên trong nội dung (mặc dù nó có thể được sử dụng đúng cách để hiển thị dữ liệu tĩnh).

Giải pháp dễ dàng tại đây: chuyển tệp JS của bạn sang chế độ xem, ở đó bạn sẽ có thể sử dụng bất kỳ trình trợ giúp xem nào.

0

Thực tế, nó phù hợp với tôi. Bạn cần làm:

= render 'way/to/partial' 

trong đó 'cách/đến/một phần' là đường dẫn tương đối trong thư mục nội dung hiện có. Điều có dây là trong đường dẫn, bạn cần phải bỏ qua thư mục cấp đầu tiên bên dưới nội dung.

+0

Cái gì? Làm thế nào nó có thể được mà đưa ra một tham số khác nhau cho một phương pháp làm cho nó có sẵn ?? Bạn có một ví dụ làm việc ở đâu đó? – ZedTuX

0

Điều này phù hợp với tôi. (Ví HAML)

= Haml::Engine.new(File.read(File.join(Rails.root, 'app/views/xxxxx','_form.html.haml'))).render(Object.new, :hello => "Hello World") 

Và, cần thêm sự phụ thuộc vào đầu tập tin phải được cập nhật như: Trong trường hợp này, các tập tin phụ thuộc cần thiết để có trong tài sản.

//= depend_on xxxxx/_form.html.haml 
1

Tôi có vấn đề tương tự, vì vậy tôi đã viết phương pháp render này, mà có thể được sử dụng bên trong tài sản để render ERB mẫu phần:

# in lib/my_app/erb_helpers.rb 
module MyApp 
    module ERBHelpers 
    class << self 

     def render(partial_path, binding) 
     dir_name, _, partial_name = partial_path.rpartition(File::SEPARATOR) 
     file_name = "_#{partial_name}.html.erb" 
     Erubis::Eruby.new(File.read(File.join(Rails.root, 'app', 'views', dir_name, file_name)).gsub("'", %q(\\\'))).result(binding) 
     end 

    end 
    end 
end 

Sau đó, tôi sử dụng nó bên trong tập tin coffeescript như thế này:

# in app/assets/javascripts/notifications.coffee 
MyApp.notifications.templates = 
    notice: '<%= ::MyApp::ERBHelpers.render 'application/notifications/notice', content: "%content%" %>' 
    alert: '<%= ::MyApp::ERBHelpers.render 'application/notifications/alert', content: "%content%" %>' 

MyApp.notifications.create_elem = (type, content) -> MyApp.notifications.templates[type].replace('%content%', content) 

PS: tôi đã thử nghiệm nó on Rails 5.0 ứng dụng

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