Đây là một khối mã Ruby tận dụng phương thức của trình trợ giúp Rails. Nếu bạn chưa quen với các khối, bạn sẽ thấy chúng rất nhiều trong Ruby.
respond_to
là một phương thức của trình trợ giúp Rails được gắn vào lớp Trình điều khiển (hay đúng hơn là siêu lớp của nó). Đó là tham chiếu phản hồi sẽ được gửi tới Chế độ xem (sẽ đến trình duyệt).
Khối trong ví dụ của bạn là định dạng dữ liệu - bằng cách chuyển vào tham số 'định dạng' trong khối - để được gửi từ bộ điều khiển đến chế độ xem bất cứ khi nào trình duyệt đưa ra yêu cầu về dữ liệu html hoặc json.
Nếu bạn đang ở trên máy cục bộ của mình và bạn đã cài đặt giàn giáo Post, bạn có thể truy cập http://localhost:3000/posts
và bạn sẽ thấy tất cả các bài đăng của mình ở định dạng html. Nhưng, nếu bạn nhập vào đây : http://localhost:3000/posts.json
, thì bạn sẽ thấy tất cả các bài đăng của mình trong một đối tượng json được gửi từ máy chủ.
Điều này rất thuận tiện để tạo các ứng dụng nặng javascript cần truyền json qua lại từ máy chủ. Nếu bạn muốn, bạn có thể dễ dàng tạo một api json trên back-end của bạn và chỉ vượt qua một chế độ xem - như chế độ xem chỉ mục của trình điều khiển Post của bạn. Sau đó, bạn có thể sử dụng thư viện javascript như Jquery hoặc Backbone (hoặc cả hai) để thao tác dữ liệu và tạo giao diện của riêng bạn. Chúng được gọi là UI không đồng bộ và chúng thực sự phổ biến (Gmail là một). Chúng rất nhanh và mang lại cho người dùng cuối trải nghiệm giống như máy tính để bàn hơn trên web. Tất nhiên, đây chỉ là một lợi thế của việc định dạng dữ liệu của bạn.
Cách viết của Rails 3 sẽ là thế này:
class PostsController < ApplicationController
# GET /posts
# GET /posts.xml
respond_to :html, :xml, :json
def index
@posts = Post.all
respond_with(@posts)
end
#
# All your other REST methods
#
end
Bằng cách đặt respond_to :html, :xml, :json
ở đầu lớp, bạn có thể khai báo tất cả các định dạng mà bạn muốn trình điều khiển gửi đến các khung nhìn của mình.
Sau đó, trong phương thức của bộ điều khiển, tất cả những gì bạn phải làm là respons_with (@whthing_object_you_have)
Nó chỉ đơn giản hóa mã của bạn nhiều hơn một chút so với những gì Rails tự động tạo.
Nếu bạn muốn biết về hoạt động bên trong của ...
Từ những gì tôi hiểu, Rails hướng nội các đối tượng để xác định định dạng thực tế sẽ là gì. Giá trị biến 'định dạng' dựa trên nội quan này. Rails có thể làm rất nhiều với một chút thông tin. Bạn sẽ ngạc nhiên khi một bài đăng @post hoặc: đơn giản sẽ đi được bao xa.
Ví dụ: nếu tôi có tệp một phần _user.html.erb trông như thế này:
_user.html.erb
<li>
<%= link_to user.name, user %>
</li>
Sau đó, điều này một mình trong chế độ xem chỉ mục của tôi sẽ cho Rails biết rằng cần phải tìm một phần 'người dùng' và lặp qua tất cả các đối tượng của 'người dùng':
index.html.erb
<ul class="users">
<%= render @users %>
</ul>
sẽ cho Rails biết rằng cần phải tìm một phần 'người dùng' và lặp qua tất cả các đối tượng của 'người dùng':
Bạn có thể thấy bài đăng trên blog này hữu ích: http://archives.ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w-respond_with
Bạn cũng có thể kiểm tra nguồn: https://github.com/rails/rails