Рельсы отвечают: как это работает?



Я читал здесь и там о том, как круто respond_with метод в Rails 3. Но я даже не могу найти ссылку на него ни в API Rails, ни в поиске источника. Может ли кто-нибудь объяснить мне, как это работает (какие параметры вы можете использовать и т. д.) или указать мне место, где он фактически реализован, чтобы я мог самостоятельно просмотреть код?

545   1  

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

    Ничего не найдено.