Это блок кода Ruby, который использует вспомогательный метод Rails. Если вы еще не знакомы с блоками, вы часто их увидите в Ruby.
respond_toявляется вспомогательным методом Rails, который присоединен к классу Controller (точнее, к его суперклассу). Он ссылается на ответ, который будет отправлен в представление (которое отправляется в браузер).
Блок в вашем примере - это форматирование данных - путем передачи параметра «format» в блоке - для отправки из контроллера в представление всякий раз, когда браузер запрашивает данные html или json.
Если вы находитесь на своем локальном компьютере, и у вас настроена почтовая платформа Post, вы можете перейти на 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верхнюю часть класса, вы можете объявить все форматы, которые вы хотите, чтобы ваш контроллер отправлял вашим представлениям.
Затем в методе контроллера все, что вам нужно сделать, это response_with (@whwhat_object_you_have)
Это просто упрощает ваш код немного больше, чем то, что автоматически генерирует Rails.
Если вы хотите узнать о внутренней работе этого ...
Из того, что я понимаю, Rails анализирует объекты, чтобы определить, каким будет фактический формат. Значение переменных 'format' основано на этом самоанализе. Rails может многое сделать с небольшим количеством информации. Вы будете удивлены тем, как далеко зайдет простой @post или: post.
Например, если у меня был частичный файл _user.html.erb, который выглядел так:
_user.html.erb
<li>
<%= link_to user.name, user %>
</li>
Затем, только это в моем представлении индекса позволит Rails знать, что ему нужно найти частичную часть «users» и выполнить итерацию по всем объектам «users»:
index.html.erb
<ul class="users">
<%= render @users %>
</ul>
позволит Rails узнать, что ему нужно найти частичку 'user' и выполнить итерацию по всем объектам 'users':
Вы можете найти этот пост полезным: http://archives.ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w-respond_with
Вы также можете просмотреть источник: https://github.com/rails/rails