2

我如何在一個模型欄中使用render_to_string如何在rails模型中render_to_string?

如果你這樣說:「你永遠不應該從模型中渲染任何東西,任何渲染 - 都是控制器和視圖的責任。」聽我說,或建議一個更好的方式,你可能會解決這個問題

我的模型是郵件。只是不是電子郵件,傳真。

+1

Ruby的'to_s'方法怎麼樣(幾乎任何東西都可以) – bricker

+0

不能'to_s'一個Rails視圖。 – maletor

+0

查看?我以爲你說模特?您可能需要發佈一些僞代碼,您現在已經失去了我:) – d11wtq

回答

3

這裏的工作代碼:

# instance_vars must follow the '@name' convention. 
# 
def render_template(template_content, options={}) 
    local_vars = options[ :local_vars ] || {} 
    instance_vars = options[ :instance_vars ] || {} 

    view = ActionView::Base.new(Rails::Configuration.new.view_path) 

    instance_vars.each do | name, value | 
    view.instance_variable_set(name, value) 
    end 

    rendering_options = { 
     :inline => template_content, 
     :type => :builder, 
     :locals => local_vars 
    } 

    view.render(rendering_options) 
end 

測試on Rails的2.3.14。請注意,我沒有找到這個想法,但只是用一種方便的方法來包裝它。

當然,不要以爲我提倡意見,因爲這;-)

+1

注意Rails 3使用ActionView :: Base.new(Rails.root.join('app','views')) – riley

3

如果你正在尋找一個優雅的解決方案,也許你可以實現一個ActionFaxer :: Base。您將能夠遵循ActionMailer::Base的實施,但專門用於傳真。採取這種方法應該可以讓你訪問render_to_string。

值得注意的是,在這種情況下,你會不會增加render_to_string到一個模型,而是引入Faxer,這將處理模型的概念。

如果你只是需要一個模型,你可以直接編寫針對ERB或其它模板語言實現內再現模板任意支持。

有關Faxer概念的好處是,它可以抽象出更多然後簡單地渲染到包括像調度,排隊和保證交貨。

如果你成功了,也許當你完成後,你可以把它變成一個寶石。