gpt4 book ai didi

ruby-on-rails - rails : overriding as_json for dynamic value -- is there a smarter way?

转载 作者:行者123 更新时间:2023-12-04 00:47:40 26 4
gpt4 key购买 nike

我想输出一个附属链接列表,每个链接都被标记以识别当前用户。在 HTML 中会很简单,但我们正在编写 API,因此输出是 JSON。

我有它的工作,但它似乎过于复杂。这是最好的方法吗?

我的模型 AffiliateLink 包含一个字段(链接的原始 HTML),我将通过添加 token 动态转换和输出该字段。我有一个生成替换的模型方法——它不是微不足道的,因为我们使用多个附属机构,每个附属机构都有一个这个方法知道的特殊转换规则:

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在模型中,将原来的 html_code 替换为 link_html

  • ...
    def as_json(options = {})
    super(:methods => :link_html, :except => :html_code)
    end
  • 迭代 Controller 方法中返回的集合以进行转换

  • ...
    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

    这似乎有很多事情要做,只是为了完成我的十几岁的转变。欢迎提供有用的建议(与这个问题有关,而不是与代码的其他方面有关,现在还在不断变化)。

    最佳答案

    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

    附属链接.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:
  • this article描述你的问题。
  • the gem作者提出的解决方案。
  • this railscast关于使用 gem 。


  • 3) 最后,方便的解决方案。如果你有一个方便的模型关系,这是干净的:

    假装附属链接 belongs_to :user .并假设 user_token 是 User 的可访问属性。

    附属链接.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

    关于ruby-on-rails - rails : overriding as_json for dynamic value -- is there a smarter way?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11811757/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com