2012-05-28 27 views
5

Tôi có một kịch bản mà tôi muốn trả lại một tin nhắn dài với JSON của mình. Thay vì viết nó ra với chuỗi nối tôi muốn đặt cùng một mẫu erb mà tôi có thể render vào JSON của tôi. Dưới đây là đoạn code Tôi hiện đang cố gắng:Làm mẫu ERB trong Mẫu RABL

object @invitation 

node(:phone_message) do |invitation| 
    begin 
    old_formats = formats 
    self.formats = [:text] # hack so partials resolve with html not json format 
    view_renderer.render(self, {:template => "invitation_mailer/rsvp_sms", :object => @invitation}) 
    ensure 
    self.formats = old_formats 
    end 
end 

Tất cả mọi thứ hoạt động như dự kiến ​​lần đầu tiên mã này được chạy, tuy nhiên, tôi chạy vào vấn đề lần thứ hai tôi chạy nó vì nó nói rằng có một biến Ví dụ mất tích (mà tôi giả định đã được tạo và lưu trữ trong lần chạy đầu tiên).

phương pháp xác định _app_views_invitation_mailer_rsvp_sms_text_erb___2510743827238765954_2192068340 cho # (ActionView :: Template :: Lỗi)

Có cách nào tốt hơn để làm mẫu ERB vào rabl?

Trả lời

2

Bạn có thể thử sử dụng ERB như độc lập, và không đi qua các renderer xem, như vậy:

object @invitation 

node(:phone_message) do |invitation| 
    begin 
    template = ERB.new(File.read("path/to/template.erb")) 
    template.result(binding) 
    end 
end 

binding là một phương pháp trên đối tượng (thông qua các mô-đun hạt nhân) và nó trả về ràng buộc mà giữ bối cảnh hiện nay, bao gồm cả các instance variable (@invitation trong trường hợp này)

cập nhật:

Đừng thực sự biết nếu điều này sẽ giúp bạn có được thêm nữa (và tôi cũng nhận ra nó được hơn một năm kể từ khi bạn đăng này), nhưng đây là một cách khác để làm cho ERB mẫu trong một thời trang độc:

view = ActionView::Base.new(ActionController::Base.view_paths, {}) 

class << view 
include ApplicationHelper 
include Rails.application.routes.url_helpers 
end 
Rails.application.routes.default_url_options = ActionMailer::Base.default_url_options 
view.render(:file => "path/to/template.html.erb", :locals => {:local_var => 'content'}) 

Khi tôi có thời gian tôi thực sự nên thử điều này với Rabl .

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