2009-12-24 14 views
58

我的一個模型對象有一個「文本」列,其中包含網頁的完整HTML。如何直接從Rails控制器返回HTML?

我想編寫一個控制器動作,它直接從控制器直接返回此HTML,而不是像控制器上的其他動作一樣通過.erb模板傳遞它。

我的第一個想法是把這個動作放到一個新的控制器中,並用一個空的佈局製作一個自定義的.erb模板,在模板中只是<%= modelObject.htmlContent %> - 但我想知道是否有更好的方法在Rails中做到這一點。

回答

83

在你的控制器respond_to塊,你可以使用:

render :text => @model_object.html_content 

或:

render :inline => "<%= @model_object.html_content %>" 

所以,像這樣:

def show 
    @model_object = ModelObject.find(params[:id]) 

    respond_to do |format| 
    format.html { render :text => @model_object.html_content } 
    end 
end 
+4

(疏)文檔在http://api.rubyonrails.org/classes/ActionView/Rendering .html以防其他人正在尋找它! :) – 2010-12-16 15:06:36

+5

真的有必要使用'respond_to'塊嗎? 'render:text =>'

text

''在Rails 4中對我很好。我雖然'respond_to'只是爲了處理多個Accept-Types。 – 2013-11-21 12:23:04

+1

使用'render text:...'時,Rails 5會產生棄用警告。如果你想渲染HTML,使用'render html:...',對於文本使用'render plain:...'。 – 2017-07-05 07:21:58

3

其作品對我來說

def show 
    @model_object = ModelObject.find(params[:id]) 

    respond_to do |format| 
    format.html { render :inline => "<%== @model_object['html'] %>" } 
    end 
end 
38

在最新的Rails(4.1.x的),至少,這比接受的答案更簡單:

def show 
    render html: '<div>html goes here</div>'.html_safe 
end 
+1

非常感謝,它也適用於rails 5 api-only :) – 2017-08-31 03:47:35

相關問題