0

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

url = @post.myFile.url

所以,我不想将 URL 单独存储在数据库中,但希望它成为“发布”模型的属性,并且应该能够设置和获取它,并且成为我发送的 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

在我的模型中并将这些行添加到控制器中的 index 方法中

@posts.each do |myPost|
   myPost.file_url = myPost.myFile.url
end

但未能成功。任何帮助将不胜感激。谢谢你。

4

3 回答 3

0

这里有两个问题:一方面,您在声明属性访问器时处于正确的轨道上。而不是控制器中的循环在您的模型中定义它。

def file_url
  myFile.url
end

第二个问题是,当您在控制器中序列化数组时,它会调用每个元素的默认序列化,其中不包括您的虚拟属性 file_url。

我为此推荐的解决方案是ActiveModelSerializers gem,它允许您轻松自定义控制器使用的序列化。添加虚拟属性非常容易。(请注意,在您的模型中覆盖 as_json 方法将不起作用,因为数组序列化程序不会使用它)

于 2013-04-10T23:09:13.193 回答
0

您可以考虑使用RABL gem 来控制 Json 输出的格式。

实际上,它添加了 Json 格式的视图文件,您可以将 URL 作为节点添加到数据中。

于 2013-04-11T07:15:00.573 回答
0

我不确定我是否完全理解你的目标。您是否希望在呈现 JSON之前从每个帖子中都可以使用 file_url ?如果是这样,您可以将 api_attributes 添加到您的模型中,即:

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_attributes 的所有帖子。希望这就是你要找的。

于 2013-04-10T22:55:04.327 回答