Ruby on rails RubyonRails—向ActiveRecord::Base添加属性,但不希望在数据库中持久化,但应在object json中

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的一部分 在我的

我有一个名为“Entry”的ActiveRecord::基本模型。它附带了一个文件。我用回形针上传文件。现在,当我在视图中使用视图和服务器端代码时,一切都很愉快。但是现在,我想使用JSON和AJAX,用纯HTML5呈现前端。因此,为此,我需要文件的URL。但是回形针只存储文件名、文件内容类型等,我可以用

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属性。我的问题的答案如下: