2009-12-24 35 views
58

Một trong các đối tượng mô hình của tôi có cột 'văn bản' chứa HTML đầy đủ của trang web.Làm cách nào để trả về HTML trực tiếp từ bộ điều khiển Rails?

Tôi muốn viết một hành động điều khiển đơn giản trả về HTML này trực tiếp từ bộ điều khiển thay vì truyền qua các mẫu .erb như phần còn lại của các hành động trên bộ điều khiển. Ý tưởng đầu tiên của tôi là kéo hành động này vào bộ điều khiển mới và tạo một mẫu .erb tùy chỉnh với bố cục trống và chỉ <%= modelObject.htmlContent %> trong mẫu - nhưng tôi tự hỏi liệu có cách nào tốt hơn để thực hiện điều này trong Rails hay không.

Trả lời

83

Trong khối điều khiển respond_to của bạn, bạn có thể sử dụng:

render :text => @model_object.html_content 

hay:

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

Vì vậy, một cái gì đó như:

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

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

(thưa thớt) tài liệu tại http://api.rubyonrails.org/classes/ActionView/Rendering .html trong trường hợp bất kỳ ai khác đang tìm kiếm nó! :) –

+5

Có thực sự cần thiết để sử dụng khối 'respond_to' không? 'render: text => '

văn bản

'' hoạt động tốt cho tôi trong Rails 4. Mặc dù 'respond_to' chỉ là để đối phó với nhiều Accept-Types. –

+1

Rails 5 mang lại cảnh báo không dùng nữa khi sử dụng 'render text:…'. Nếu bạn muốn kết xuất HTML, sử dụng 'render html:…', để sử dụng văn bản 'render plain:…'. –

3

công trình của nó đối với tôi

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

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

Trong Rails mới nhất (4.1.x), ít nhất, đây là đơn giản hơn nhiều so với câu trả lời được chấp nhận:

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

cảm ơn rất nhiều, nó cũng hoạt động trong đường ray 5 api-only :) –

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