我想输出会员链接列表,每个链接都标记为标识当前用户。它在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
要在JSON中获取正确的链接html,我已经做了以下事情:
attr_accessor :link_html
添加到模型...
def set_link_html(token)
self.link_html = link_with_tracking_token(token)
end
as_json
,用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
这似乎要做很多事情,只是为了完成我的teensy-weensy转换。有用的建议(与此问题有关,而不是代码的其他方面,现在不断变化)是受欢迎的。
答案 0 :(得分:18)
1)快速解决您的问题(如here所示):
affiliate_links_controller.rb
def index
@links = Admin::AffiliateLink.all # TODO, pagination, etc.
respond_to do |format|
format.html # index.html.erb
format.json do
render json: @links.to_json(:account_tracking_token => account_tracking_token)
end
end
end
AffiliateLink.rb
# I advocate reverse_merge so passed-in options overwrite defaults when option
# keys match.
def as_json(options = {})
json = super(options.reverse_merge(:except => :html_code))
json[:link_with_token] = link_with_token(options[:account_tracking_token])
json
end
2)如果您真的在编写API,那么这是一个更具核心的解决方案:
3)最后,方便的解决方案。如果你有一个方便的模型关系,这是干净的:
假装AffiliateLink belongs_to :user
。并假设user_token是User的可访问属性。
AffiliateLink.rb
# have access to user.user_token via relation
def link_with_token
# some gnarly code that depends on a lot of stuff the model knows
# that returns a proper link
end
def as_json(options = {})
super(options.reverse_merge(:methods => :link_with_token, :except => :html_code))
end
affiliate_links_controller.rb
def index
@links = Admin::AffiliateLink.all # TODO, pagination, etc.
respond_to do |format|
format.html # index.html.erb
format.json do
render json: @links
end
end
end