在Rails模型JSON输出中包含任意字段

时间:2012-03-05 16:23:32

标签: ruby-on-rails ruby

我正在使用Rails作为REST服务器,我的一个模型有一个描述字段。在该模型的JSON表示中,我需要输出常规描述字段和名为description_markdown的任意非DB属性,该属性只是通过降价过滤器运行的描述。我已经知道如何使用redcarpet通过markdown运行文本,例如:

@post = Post.find(params[:id])
markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, :autolink => true, :space_after_headers => true, :fenced_code_blocks => true, :lax_html_blocks => true)
description_markdown = markdown.render(@post.description).html_safe

但我真正需要的是让description_markdown成为@post上的一个属性(比如@ post.description_markdown),并将其输出到@ post的JSON表示中。

3 个答案:

答案 0 :(得分:4)

我通常使用RABL gem为我的API构建JSON视图 - 它为构建JSON响应提供了很大的灵活性,例如创建自定义子节点,添加任意代码。看看这个。 但是,要回答您的问题,您可以覆盖as_json的{​​{1}}方法,以包含Post的返回值。像(未经测试)的东西:

description_markdown

然后,在控制器中:

#post.rb
class Post < ActiveRecord::Base

  def description_markdown
    ...
  end
  ...
  def as_json(options)
    super(:only => [:attributes_you_want], :methods => [:description_markdown])
  end
  ...
end

希望,这有帮助。

答案 1 :(得分:2)

您可以将description_markdown添加到您的模型中:

def description_markdown
    markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, :autolink => true, :space_after_headers => true, :fenced_code_blocks => true, :lax_html_blocks => true)
    markdown.render(description).html_safe
end

然后将其添加到模型的as_json using :methods

def as_json(options = { })
    super((options || { }).merge({
        :methods => [:description_markdown]
    }))
end

这会将您的description_markdown输出添加到模型的标准JSON表示中。 options || { }会出现,以防有人向您nil提出options,然后我们将:methods合并到选项中,然后将其移交给ActiveRecord :: Base举重。如果您希望外人能够发送自己的options值,则需要更加复杂的:methods合并。

答案 2 :(得分:0)

只是想添加一个替代方案,以防您在控制器中定义所需的字段/数据(就像在Rails 4应用程序中那样),如下所示:

Post.to_json(only: [], methods: [:generate_markdown])

在您的邮政编码中,添加:

def generate_markdown
    markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, :autolink => true, :space_after_headers => true, :fenced_code_blocks => true, :lax_html_blocks => true)
    return markdown.render(@post.description).html_safe