Рельсы отвечают: как это работает?
Я читал здесь и там о том, как круто respond_with метод в Rails 3. Но я даже не могу найти ссылку на него ни в API Rails, ни в поиске источника. Может ли кто-нибудь объяснить мне, как это работает (какие параметры вы можете использовать и т. д.) или указать мне место, где он фактически реализован, чтобы я мог самостоятельно просмотреть код?
1 ответ:
обновление для Rails 4.2+
#respond_withи::respond_to(Н.б. метод класса)больше не часть рельсов. Они были перенесены в сторонние ответчики драгоценный камень с рельсов 4.2 (заметки/commit датировано августом 2014). Хотя ответчики не включены в Rails по умолчанию, это зависимость от Devise и, следовательно, доступна во многих приложениях Rails.The
#respond_toметод экземпляра,, составляет еще часть рельсов (5.2rc1 на момент написания этой статьи).официальная документация Rails API для
ActionController::MimeRespondsобъясняет, как#respond_toстроительство. Оригинальные направляющие Rails комментарии к документации для#respond_withи::respond_toвсе еще можно найти в ответчики gem исходный код.
Оригинальный Ответ
код для ответчиков основан на классе и a модуль. MimeResponds входит в ActionController:: Base, класс
ApplicationControllerнаследует от. То есть ActionController:: Responder который обеспечивает поведение по умолчанию при использовании respond_with.
по умолчанию единственным поведением rails в ответе является неявная попытка отобразить шаблон с именем, соответствующим действию. Все остальное требует больше инструкций в действие, или пользовательский вызов respond_to с блоком для обработки нескольких ответов формата.
поскольку большинство контроллеров используют довольно распространенный шаблон настройки, ответчики обеспечивают дополнительный уровень абстракции, вводя больше поведения по умолчанию. Прочитайте действия, вызывающие to_xml / to_json для определенных форматов, и действия мутатора, обеспечивающие то же самое, а также перенаправление для успешных действий мутатора.
есть несколько возможностей для настройки поведения респондентов, от тонких настроек до полного переопределения или расширения поведения.
Класс Уровень:
respond_toздесь вы указываете форматы, которые должен обрабатывать ответчик. Форматы могут быть настроены относительно того, к каким действиям они будут применяться. Каждый формат может быть задан с помощью отдельных вызовов, что позволяет полностью настроить действия для каждого формата.
# Responds to html and json on all actions respond_to :html, :json # Responds to html and json on index and show actions only. respond_to :html, :json, :only => [:index,:show] # Responds to html for everything except show, and json only for index, create and update respond_to :html, :except => [:show] respond_to :json, :only => [:index, :create, :update]Класс Уровень:
responderэто атрибут класса, который содержит Ответчик. Это может быть все, что отвечает на вызов, что означает, что вы можете использовать proc/lambda или класс, который отвечает на вызов. Другой альтернативой является смешивание одного или модулей с существующим ответчиком для перегрузки существующих методов, увеличивая поведение по умолчанию.
class SomeController < ApplicationController respond_to :json self.responder = proc do |controller, resources, options| resource = resources.last request = controller.request if request.get? controller.render json: resource elsif request.post? or request.put? if resource.errors.any? render json: {:status => 'failed', :errors => resource.errors} else render json: {:status => 'created', :object => resource} end end end endхотя могут быть некоторые интересные случаи использования edge, более вероятно, что расширение или смешивание модулей в ответчике по умолчанию будет более распространенными шаблонами. В любом случае, релевантными являются следующие варианты ресурсы и параметры, как они передаются через ОТ из respond_with.
Уровне, Например:
respond_withпараметры здесь те, которые будут переданы для визуализации или redirect_to в контроллере, но они включены только для сценариев успеха. Для действий GET это будут вызовы рендеринга, для других действий это будут варианты перенаправления. Вероятно, наиболее полезным из них является
:locationопция, которая может быть использована для переопределения этого путь перенаправления в случае, если аргументов для respond_with недостаточно для построения правильного URL.# These two are essentially equal respond_with(:admin, @user, @post) respond_with(@post, :location => admin_user_post(@user, @post) # Respond with a 201 instead of a 200 HTTP status code, and also # redirect to the collection path instead of the resource path respond_with(@post, :status => :created, :location => posts_path) # Note that if you want to pass a URL with a query string # then the location option would be needed. # /users?scope=active respond_with(@user, :location => users_path(:scope => 'active'))
в качестве альтернативы ответчики gem не только предоставляет некоторые модули для переопределения некоторых из поведения по умолчанию. Он переопределяет ответчик по умолчанию с анонимным классом, который расширяет ответчик по умолчанию, и предоставляет метод уровня класса для смешивания пользовательских модулей с этим классом. Наиболее полезным здесь является флэш-ответчик, который предоставляет набор вспышек по умолчанию, делегируя настройку системе I18n,
config/locales/en.ymlпо умолчанию.некоторые примеры пользовательских ответчиков, которые я использовал в предыдущих проектах, включают ответчик, который автоматически оформлял мои ресурсы и предоставлял набор заголовков страниц по умолчанию с интерфейсом для легкой настройки или переопределения заголовка страницы.
Comments