Chcę wyświetlić listę linków partnerskich, z których każdy jest oznaczony w celu identyfikacji bieżącego użytkownika. Byłoby to proste w HTML, ale piszemy API, więc wyjście to JSON.Szyny: przesłonięcie wartości as_json dla wartości dynamicznej - czy istnieje mądrzejszy sposób?
Mam to działa, ale wydaje się zbyt skomplikowane. Czy to najlepsze podejście?
Mój model, AffiliateLink zawiera pole (nieprzetworzony kod HTML linku), który będę transformował i wyprowadzał w locie, dodając token. Mam metodę, która produkuje modelu wymiany - to nietrywialne, ponieważ używamy wielu oddziałów i każdy ma specjalną regułę transformacji, że metoda ta wie o:
def link_with_token(user_token)
# some gnarly code that depends on a lot of stuff the model knows
# that returns a proper link
end
Aby dostać mój prawidłowy łącze HTML w JSON I zrobili te rzeczy:
- dodać
attr_accessor :link_html
modelować - dodać metodę instancji, aby ustawić nowy Accessor
.. .
def set_link_html(token)
self.link_html = link_with_tracking_token(token)
end
- przesłanianie
as_json
w modelu, zastępując oryginalne html_code z link_html
...
def as_json(options = {})
super(:methods => :link_html, :except => :html_code)
end
- iteracyjne nad kolekcji zwrócony w metodzie kontrolera do wykonaj transformację
...
def index
@links = Admin::AffiliateLink.all # TODO, pagination, etc.
respond_to do |format|
format.html # index.html.erb
format.json do
@links.each do |link|
link.set_link_html(account_tracking_token)
end
render json: @links
end
end
end
To wydaje się dużo rzeczy do zrobienia, aby dostać się mój teensy-weensy transformacja zrobić. Pomocne sugestie (odnoszące się do tego problemu, a nie do innych aspektów kodeksu, które teraz pojawiają się) są mile widziane.
są opcje takie jak 'Rabl' lub po prostu faktycznie przy użyciu szablonu, aby pomóc uczynić swój' json' vs. przesłanianie 'metody as_json' bez dyskusji? – nowk
Mam dabbled z RABL, ale wydaje się, że przedstawia więcej przeszkód (szczególnie w wyniku ograniczonej doc). Któregoś dnia po prostu przeczytam kod i wymyślę, jak go użyć. Na razie "as_json" wydaje się być dużo. –