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?
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'))
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.
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