2010-03-17 32 views
17

Tôi đang chuyển một ứng dụng từ Merb 1.1/1.8.7 sang Rails 3 (beta)/1.9.1 sử dụng các phản hồi JSON chứa các đoạn HTML, ví dụ: một vùng chứa JSON chỉ định cập nhật, trên hồ sơ người dùng và cập nhật hàng người dùng trông giống như. Trong Merb, vì bất kỳ một phương thức điều khiển nào được trả về cho client, người ta có thể đặt cùng một Hash, gán một phần được trả về cho một trong các khóa và trả về hash.to_json (mặc dù chắc chắn đó không phải là cách tốt nhất.) , có vẻ như để lấy lại dữ liệu cho khách hàng, người dùng phải sử dụng kết xuất và kết xuất chỉ có thể được gọi một lần, do đó, việc hiển thị hàm băm thành json sẽ không hoạt động do hiển thị một phần.Trong Rails 3, làm cách nào để hiển thị HTML trong phản hồi JSON?

Từ đọc xung quanh, có vẻ như người ta có thể đưa dữ liệu đó vào tệp xem .erb JSON, với <% = hiển thị một phần%> vào và hiển thị. Có cách nào để giải quyết vấn đề này (trả về JSON có chứa một hoặc nhiều đoạn HTML) không?

Trong Merb:
điều khiển:

only_provides :json 
... 
self.status = 204 # or appropriate if not async 
return { 
    'action' => 'update', 
     'type' => 'user', 
     'id' => @user.id, 
     'html' => partial('user_row', format: :html, user: @user) 
}.to_json 

Trong Rails:
điều khiển:

respond_to do |format| 
    format.json do 
    render template: '/json/message-1', 
     locals: { 
     action: 'update', 
     type: 'user', 
     id: @user.id, 
     partial: 'user_row.html.erb', 
     locals: { user: @user } 
     } 
    end 
end 

xem: json/tin nhắn-1.json.erb

{ 
    "action": <%= raw action.to_json %>, 
    "type": <%= raw type.to_json %>, 
    "id": <%= raw id.to_json %>, 
    "html": <%= raw render(partial: partial, locals: locals).to_json %> 
} 
+0

Câu trả lời của tôi cho một câu hỏi tương tự http://stackoverflow.com/a/15574453/667598 –

Trả lời

-12
class UsersController < ApplicationController 
    respond_to :json 

    def show 
    @user = User.find(params[:id]) 
    respond_with(@user) do |format| 
     if @user.save 
     format.json { render :json => @user } 
     else 
     format.json { render :json => @user.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 
end 
+0

Tôi có thể thiếu điểm: cách duy nhất tôi có thể thấy trong ví dụ này để nhận các đoạn HTML vào JSON sẽ được thực hiện #to_json trên User và có nó render partials, có lẽ sẽ chạy afoul của vấn đề kết xuất kép và, ngay cả khi không, sẽ không cho phép các đoạn khác nhau được sử dụng trong các ngữ cảnh khác nhau, ví dụ user_row v. user_detail. Có điều gì ở đây tôi không nhận được? – ylg

26

Gần nhất với bản gốc từ cách tiếp cận Merb tôi có thể tìm thấy trong Rails là sử dụng #render_to_string

render json: { 
    'action' => 'update', 
    'type' => 'user', 
     'id' => @user.id, 
    'html' => render_to_string(partial: 'user_row.html.erb', locals: { user: @user }) 
} 

này được xung quanh một chút công bằng của sự phức tạp mà đến từ cách thêm một lớp mẫu json.erb vào hỗn hợp, cho dù đó là cách tiếp cận Rails Purist tôi không thể nói; có thể một cái gì đó với RJS thường sẽ được sử dụng.

+0

Cảm ơn, tôi đã tìm phương pháp "render_to_string" này! – Robin

+1

Tôi nhận thấy bạn cũng có thể chỉ cần thêm .html dưới dạng mở rộng, .erb sẽ được thêm tự động, hữu ích nếu bạn đang sử dụng phương thức render (.slim) –

+0

render_to_string đã giúp tôi .. cảm ơn .. – Abhi

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