на главнуюВсе эхи RU.RAILS
войти ?

Rails: Как работает блок response_to?

От 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
Или коротким

FGHI-url этого письма: area://RU.RAILS?msgid=2:5030/1374+5d3a001f