Rails odpowiada: jak to działa?

Czytałem tu i ówdzie o tym, jak fajna jest metoda respond_with w Rails 3. Ale nie mogę nawet znaleźć odniesienia do niego w interfejsie API Rails lub przeszukując źródło. Czy ktoś może mi wyjaśnić, jak to działa (jakich opcji można użyć, itp.) lub wskazać mi miejsce, w którym jest faktycznie zaimplementowany, abym mógł sam przeczytać kod?

Author: Amelia, 2011-05-25

1 answers

Aktualizacja dla Rails 4.2 +

#respond_with oraz ::respond_to (N. B. metoda klasy) są nie są już częścią Rails . Zostały przeniesione do gem-u stron trzecich od wersji Rails 4.2 (uwagi do wydania / commit z sierpnia 2014). Chociaż respondery nie są domyślnie dołączone do Rails, są zależne od Devise i dlatego są dostępne w wielu aplikacjach Rails.

The #respond_to metoda instancji, jest jednak nadal częścią Rails (5. 2rc1 w chwili pisania tego tekstu).

Oficjalna dokumentacja rails API dla ActionController::MimeResponds wyjaśnia, jak działa {[5] }. Oryginalne komentarze do dokumentacji Rails dla #respond_with i ::respond_to nadal można znaleźć w kodzie źródłowym GEM .


Oryginalna Odpowiedź

Kod dla respondentów jest oparty na klasie i module. MimeResponds, który jest zawarty w ActionController:: Base, klasie your ApplicationController dziedziczy od. Następnie istnieje ActionController::Responder , który zapewnia domyślne zachowanie podczas używania respond_with.


Domyślnie jedynym zachowaniem, jakie rails dostarcza w odpowiedzi, jest domyślna próba wyrenderowania szablonu o nazwie pasującej do akcji. Wszystko poza tym wymaga więcej instrukcji wewnątrz akcji lub niestandardowego wywołania respondent_to z blokiem do obsługi odpowiedzi w wielu formatach.

Ponieważ większość kontrolerów używa dość powszechnego wzorca dostosowywanie, respondenci zapewniają dodatkowy poziom abstrakcji, wprowadzając więcej domyślnych zachowań. Odczytuje akcje wywołujące to_xml/to_json dla określonych formatów oraz akcje mutatora zapewniające takie same, jak i przekierowania dla udanych akcji mutatora.


Istnieje kilka możliwości, aby dostosować sposób zachowania reagentów, od subtelnych poprawek do całkowitego nadpisania lub rozszerzenia zachowania.

Poziom Klasy: respond_to

Tutaj podajesz formaty, które Respondent powinien się tym zająć. Formaty można dostosować do działań, do których będą miały zastosowanie. Każdy format może być określony za pomocą oddzielnych wywołań, co pozwala na pełne dostosowanie działań dla każdego formatu.

# 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]

Poziom Klasy: responder

Jest to atrybut klasy, który przechowuje responder. Może to być wszystko, co odpowiada na wywołanie, co oznacza, że możesz użyć proc / lambda lub klasy, która odpowiada na wywołanie. Inną alternatywą jest połączenie jednego lub kilku modułów z istniejącym reaguje na przeciążenie istniejących metod, zwiększając domyślne zachowanie.

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

Chociaż może być kilka interesujących przypadków użycia edge, jest bardziej prawdopodobne, że rozszerzanie lub mieszanie modułów w domyślny responder byłoby bardziej powszechnym wzorcem. W każdym razie, opcje, które są istotne są zasoby i opcje, ponieważ są one przekazywane z from respond_with.

Poziom Instancji: respond_with

Tutaj są opcje, które zostaną przekazane do renderowania lub redirect_to w kontrolerze, ale są one uwzględniane tylko w przypadku scenariuszy sukcesu. Dla akcji GET będą to wywołania renderowania, dla innych akcji będą to opcje przekierowania. Prawdopodobnie najbardziej przydatną z nich jest opcja :location, która może być użyta do nadpisania ścieżki przekierowania w przypadku, gdy argumenty respond_with nie są wystarczające do zbudowania właściwego adresu 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'))

Jako alternatywę, responderzy gem nie tylko zapewniają niektóre moduły do nadpisywania niektóre z domyślnych zachowań. Nadpisuje domyślny responder anonimową klasą, która rozszerza domyślny responder i zapewnia metodę na poziomie klasy do mieszania w niestandardowych modułach do tej klasy. Najbardziej przydatny jest tutaj Flash responder, który domyślnie udostępnia zestaw błysków, delegując dostosowanie do systemu I18n, config/locales/en.yml.

Niektóre przykłady niestandardowych reagentów, których używałem w poprzednich projektach, obejmują responder, który automatycznie dekoruje Moje zasoby i dostarczono domyślny zestaw tytułów stron z interfejsem do łatwego dostosowywania lub nadpisywania tytułu strony.

 110
Author: Cluster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-08 11:35:48