我正在使用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表示中。
答案 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