Ruby on rails RubyonRails—向ActiveRecord::Base添加属性,但不希望在数据库中持久化,但应在object json中
我有一个名为“Entry”的ActiveRecord::基本模型。它附带了一个文件。我用回形针上传文件。现在,当我在视图中使用视图和服务器端代码时,一切都很愉快。但是现在,我想使用JSON和AJAX,用纯HTML5呈现前端。因此,为此,我需要文件的URL。但是回形针只存储文件名、文件内容类型等,我可以用Ruby on rails RubyonRails—向ActiveRecord::Base添加属性,但不希望在数据库中持久化,但应在object json中,ruby-on-rails,ruby,paperclip,Ruby On Rails,Ruby,Paperclip,我有一个名为“Entry”的ActiveRecord::基本模型。它附带了一个文件。我用回形针上传文件。现在,当我在视图中使用视图和服务器端代码时,一切都很愉快。但是现在,我想使用JSON和AJAX,用纯HTML5呈现前端。因此,为此,我需要文件的URL。但是回形针只存储文件名、文件内容类型等,我可以用 url = @post.myFile.url 因此,我不想将URL单独存储在DB中,而是希望它成为“Post”模型的一个属性,应该能够设置和获取它,并且是发送到客户端的JSON的一部分 在我的
url = @post.myFile.url
因此,我不想将URL单独存储在DB中,而是希望它成为“Post”模型的一个属性,应该能够设置和获取它,并且是发送到客户端的JSON的一部分
在我的控制器中,我的“索引”方法如下:
def index
@posts = Post.order("created_at desc")
respond_to do |format|
format.html # index.html.erb
format.json { render json: @posts }
end
end
我将如何改变我的模型?如何更改控制器?我试着用
attr_accessor :file_url
在我的模型中,并将这些行添加到控制器中的索引方法中
@posts.each do |myPost|
myPost.file_url = myPost.myFile.url
end
但是没有成功。任何帮助都将不胜感激。谢谢。我不确定我是否完全理解你的目标。在呈现JSON之前,是否希望每个帖子都提供文件的url?如果是这样,您可以向模型添加api_属性,即:
def api_attributes
{
id: self.id.to_s,
title: self.title.to_s,
...
file_url: self.myFile.url,
...
}
end
然后,您可以使用以下内容呈现json:
format.json { render json: @posts.collect{|post| post.api_attributes} }
这将为您提供具有指定的所有api_属性的所有帖子。希望这就是你要找的 这里有两个问题:
一方面,声明属性访问器是正确的。在模型中定义它,而不是控制器中的循环
def file_url
myFile.url
end
第二个问题是,在控制器中序列化数组时,它调用每个元素的默认序列化,其中不包括虚拟属性文件\u url
我推荐的解决方案是,它允许您轻松自定义控制器使用的序列化。添加虚拟属性非常容易。(请注意,在模型中重写as_json方法不会起作用,因为数组序列化程序不会使用它)您可以研究使用gem来控制json输出的格式
实际上,它添加了Json格式的视图文件,您可以将URL作为节点添加到数据中。使用
attr\u accessor
时出现了什么错误?那应该行得通,我不会出错的。但同时,我也没有在客户端获得file_url属性。我的问题的答案如下: