От Viktor V. Kudlak (2:5030/1374) к All
В ответ на Заголовок предыдущего сообщения в треде (Имя Автора)
Hello everybody.
Origin: http://qaru.site/questions/35715/rails-how-does-the-respondto-block-work
-+-
Rails: Как работает блок response_to?
Я просматриваю Руководство по началу работы с Rails и запутался в разделе 6.7. После создания эшафота я обнаружил в своем контроллере следующий автоматически сгенерированный блок: [[http://guides.rubyonrails.org/getting_started.html]]
```
def index
@posts = Post.all
respond_to do |format|
format.html # index.html.erb
format.json { render :json => @posts }
end
end
```
Это блок кода 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 на своих рельсах back-end и пройти только один вид - например, индексный указатель вашего Post-контроллера. Затем вы можете использовать библиотеку javascript, например Jquery или Backbone (или оба) для управления данными и создания собственного интерфейса. Они называются асинхронными UI, и они становятся популярными (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 (@whatever_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 знать, что ему нужно найти "пользовательский" частичный и повторить все объекты "пользователей":
Вы можете найти это сообщение в блоге полезным: 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
-+-
Viktor
--- GoldED+/LNX 1.1.5-b20110818
* Origin: ----> www.WriteX.ru <---- (2:5030/1374)
Ответы на это письмо:
From: Username
Заголовок следующего сообщения в треде может быть длинным и его придется перенести на новую строку
From: Username
Или коротким