Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:为动态值重写为_json——有更智能的方法吗?_Ruby On Rails_Json - Fatal编程技术网

Ruby on rails Rails:为动态值重写为_json——有更智能的方法吗?

Ruby on rails Rails:为动态值重写为_json——有更智能的方法吗?,ruby-on-rails,json,Ruby On Rails,Json,我想输出一个联盟链接列表,每个链接都被标记以识别当前用户。它在HTML中很简单,但我们正在编写一个API,因此输出是JSON 我有它的工作,但它似乎过于复杂。这是最好的方法吗 我的模型AffiliateLink包含一个字段(链接的原始HTML),我将通过添加一个标记动态转换和输出该字段。我有一个生成替换的模型方法——它非常重要,因为我们使用了多个分支,每个分支都有一个特殊的转换规则,该方法知道: def link_with_token(user_token) # some gnarly co

我想输出一个联盟链接列表,每个链接都被标记以识别当前用户。它在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,我做了以下工作:

  • 添加属性访问器:链接html到模型
  • 添加实例方法以设置新的访问器

  • 在模型中重写
    为_json
    ,用link_html替换原始html_代码

  • 迭代控制器方法中返回的集合以执行转换

为了完成我小小的转变,这似乎有很多事情要做。欢迎提供有用的建议(与此问题相关,而不是与代码的其他方面相关,目前正在不断变化)。

1)快速解决您的问题(如演示所示):

附属公司链接控制器.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
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
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
# 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

2)如果您真的在编写API,那么这是一个更为核心的解决方案:

  • 请参见描述您的问题
  • 请参阅作者提出的解决方案
  • 请参阅关于使用gem的说明

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

    假装AffiliateLink
    属于:user
    。假设user_令牌是user的可访问属性

    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
    
    # 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
    
    附属公司链接控制器.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
    
    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
    

    Rabl
    这样的选项,或者仅仅使用一个模板来帮助呈现你的
    json
    与重写
    as_json
    方法相比,是不可能的吗?我已经涉猎过Rabl,但它似乎存在更多的障碍(特别是由于文档有限)。总有一天,我会阅读代码,并找出如何使用它。就目前而言,
    as_json
    似乎已经足够多了。@还可以提及ActiveModel::Serializer,它是Rails的最新添加-请参见:,另请参见: