2013-04-10 35 views
0

我有一个名为“Entry”的ActiveRecord :: Base模型。它附有一个文件。我正在使用Paperclip上传文件。现在,当我在视图中使用视图和使用服务器端代码时,一切都很愉快。但是现在,我想使用JSON和AJAX,以纯HTML5呈现前端。所以,为此,我将需要该文件的URL。但回形针只存储文件名,文件内容类型等等,我可以检索与该文件的URL,Ruby on Rails - 将属性添加到ActiveRecord :: Base但不想保留在数据库中,但应该在对象json

url = @post.myFile.url 

所以,我不想seperately存储URL的数据库,但希望它是一个属性为“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 

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

+0

你使用'attr_accessor'得到了什么错误?这应该工作 – 2013-04-10 22:43:27

+0

我没有得到任何错误。但同时我也没有得到我的客户端的file_url属性 – Yash 2013-04-11 00:04:24

+0

我的问题的答案在这里: http://stackoverflow.com/questions/11435768/cannot-access-attr-accessor-defined - 变量 – Yash 2013-04-14 03:25:29

回答

0

我不确定我完全理解你的目标。你是否想在之前的每个帖子之前提供file_url,然后渲染你的JSON?如果是这样,你可以做加api_attributes到您的模型,即:

format.json { render json: @posts.collect{|post| post.api_attributes} } 

这会给你的所有讯息与所有的:

def api_attributes 
    { 
    id: self.id.to_s, 
    title: self.title.to_s, 
    ... 
    file_url: self.myFile.url, 
    ... 
    } 
end 

然后你可以像渲染的JSON api_attributes您指定。希望这是你正在寻找的。

0

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

def file_url 
    myFile.url 
end 

的第二个问题是,当你在一个控制器序列化阵列,它呼吁每个元素,其中不包括虚拟属性FILE_URL的默认序列化。

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

0

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

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

相关问题