Це блок коду Ruby, який використовує перевагу методу помічника Rails. Якщо ви ще не знайомі з блоками, ви побачите їх багато в Ruby.
respond_to
- це помічник Rails, який приєднаний до класу Controller (а точніше, його суперкласу). Він посилається на відповідь, яка буде надіслана Перегляду (який переходить у браузер).
Блок у вашому прикладі - це форматування даних - передаючи параметр "формату" у блоці, що надсилається від контролера до перегляду щоразу, коли браузер робить запит на HTML або json.
Якщо ви знаходитесь на своїй локальній машині і у вас налаштований ешафот для пошти, ви можете перейти до, http://localhost:3000/posts
і ви побачите всі свої повідомлення у форматі html. Але, якщо ввести це:, http://localhost:3000/posts.json
то ви побачите всі ваші публікації в об’єкті json, надісланому з сервера.
Це дуже зручно для створення важких додатків JavaScript, яким потрібно передавати json назад і назад з сервера. Якщо ви хотіли, ви можете легко створити json api на зворотній стороні рейок і пропустити лише один вид - на зразок індексного перегляду вашого контролера Post. Тоді ви можете використовувати бібліотеку javascript на зразок Jquery або Backbone (або обидва) для маніпулювання даними та створення власного інтерфейсу. Вони називаються асинхронними інтерфейсами, і вони стають дійсно популярними (Gmail - це один). Вони дуже швидкі та надають кінцевому користувачеві більш досвід роботи в Інтернеті. Звичайно, це лише одна перевага форматування даних.
Способом написання цього Rails 3 було б таке:
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
Розмістивши respond_to :html, :xml, :json
вгорі класу, ви можете оголосити всі формати, які ви хочете, щоб ваш контролер надсилав вашим переглядам.
Тоді, у методі контролера, все, що вам потрібно зробити, - це answer_with (@wever_object_you_have)
Це просто спрощує ваш код трохи більше, ніж те, що Rails автогенерує.
Якщо ви хочете дізнатися про внутрішню розробку цього ...
З того, що я розумію, Rails представляє об'єкти, щоб визначити, яким буде власне формат. Значення змінних "формат" засноване на цій самоаналізу. Рейки можуть зробити багато, трохи інформації. Ви здивуєтеся, наскільки далеко пройде проста @post або: post.
Наприклад, якщо у мене був частковий файл _user.html.erb, який виглядав так:
_user.html.erb
<li>
<%= link_to user.name, user %>
</li>
Тоді, саме це в моєму показі індексу дасть Rails знати, що йому потрібно знайти "користувачів" часткове і повторити всі об'єкти "користувачів":
index.html.erb
<ul class="users">
<%= render @users %>
</ul>
дозволить Rails знати, що потрібно знайти "користувача" частковим і повторити всі об'єкти "користувачів":
Це повідомлення може бути корисним: http://archives.ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w- reply_with
Ви також можете ознайомитись з джерелом: https://github.com/rails/rails