Я хочу вывести список партнерских ссылок, каждый из которых помечен для идентификации текущего пользователя. Это было бы просто в HTML, но мы пишем API, поэтому вывод - JSON.
У меня есть работа, но это кажется слишком сложным. Это лучший подход?
Моя модель, AffiliateLink содержит поле (необработанный HTML-код), который я буду преобразовывать и выводить на лету, добавляя токен. У меня есть модельный метод, который производит замену - это нетривиально, потому что мы используем несколько веток, и у каждого есть специальное правило преобразования, которое этот метод знает о:
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
Чтобы получить правильную ссылку html в JSON, я сделал следующее:
- добавить
attr_accessor :link_html
в модель - добавить метод экземпляра для установки нового аксессора
...
def set_link_html(token)
self.link_html = link_with_tracking_token(token)
end
- переопределить
as_json
в модели, заменив исходный html_code на link_html
...
def as_json(options = {})
super(:methods => :link_html, :except => :html_code)
end
- итерация по коллекции, возвращаемой в методе контроллера, для преобразования
...
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
Это похоже на то, что нужно сделать только для того, чтобы сделать мою трансформацию с учетом напряженности. Полезные предложения (связанные с этой проблемой, а не с другими аспектами кода, который сейчас находится в движении) приветствуются.