Это блок кода 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 знать, что ему нужно найти частичную часть «пользователей» и выполнить итерацию по всем «пользователям».объекты:
index.html.erb
<ul class="users">
<%= render @users %>
</ul>
сообщит Rails, что ему нужно найти частичную часть 'user' и выполнить итерацию по всем 'users''objects:
Вы можете найти этот пост полезным: 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