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作爲節點添加到數據中。

相關問題