Đây là một khối mã Ruby sử dụng phương thức 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à phương thức trợ giúp Rails được đính kèm với lớp Bộ điều khiển (hoặc đúng hơn là lớp siêu của nó). Nó đang tham chiếu câu trả lời sẽ được gửi đến View (sắp tới trình duyệt).
Khối trong ví dụ của bạn là dữ liệu định dạng - bằng cách truyền thông 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 yêu cầu dữ liệu html hoặc json.
Nếu bạn đang ở trên máy địa phương và bạn đã thiết lập giàn giáo, 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. Tuy nhiên, nếu bạn nhập vào: 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 tiện lợi cho việc tạo các ứng dụng javascript nặng 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 ra một api json trên đường ray của bạn back-end, và chỉ truyền một khung nhìn - giống như khung nhìn chỉ mục của bộ đ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 đang trở nên phổ biến (Gmail là một). Chúng rất nhanh và cung cấp cho người dùng cuối trải nghiệm giống như trên máy tính để bà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ác Rails 3 cách viết này sẽ là:
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
ở phía trên cùng của lớp, bạn có thể khai báo tất cả các định dạng mà bạn muốn điều khiển của bạn để gửi đến quan điểm của bạn.
Sau đó, trong phương pháp điều khiển, tất cả các bạn phải làm là respond_with (@whatever_object_you_have)
Nó chỉ đơn giản hoá mã của bạn nhiều hơn một chút so với những gì Rails tự động tạo ra.
Nếu bạn muốn biết về hoạt động bên trong của này ...
Từ những gì tôi hiểu, Rails introspects các đối tượng để xác định những định dạng thực tế sẽ là. Giá trị biến 'định dạng' dựa trên nội suy này. Rails có thể làm rất nhiều thứ với một chút thông tin. Bạn sẽ ngạc nhiên khi biết một bài viết @post đơn giản đến mức nào hoặc: bài đăng sẽ đi.
Ví dụ, nếu tôi đã có một tập tin cục bộ _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 theo quan điểm của tôi chỉ số sẽ cho phép Rails biết rằng nó cần thiết để tìm ra 'người sử dụng một phần 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 phép Rails biết rằng nó cần thiết để tìm ra 'người sử dụng' một phần và lặp qua tất cả các đối tượng của người dùng ':
Bạn có thể tìm thấy bài đăng blog 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 nội dung các nguồn: https://github.com/rails/rails
Sẽ rất tuyệt nếu tôi có thể liên kết đến tài liệu cho ActionController :: MimeResponds :: ClassMethods :: respond_to nhưng api.rubyonrails.org không xuất hiện như các siêu liên kết trực tiếp ... – Cole
respond_to sẽ kết thúc cuộc gọi (ví dụ: blah.html, blah.json, v.v.) và khớp với chế độ xem được chỉ định. Các câu trả lời khác có thể là XML, CSV và nhiều ứng dụng khác tùy thuộc vào ứng dụng. – ScottJShea
Làm cách nào để "khớp với chế độ xem được chỉ định?" – Cole