2015-11-25 85 views
0

我想使用Rails爲我的模型生成鏈接,然後我將to_json信息發送到我的Backbone模板。如何爲軌道中的JSON渲染構建數據?

我在我的控制器試過這樣:

@events.map! { |event| event.link = Rails.application.routes.url_helpers.slug_events_path({year: event.start.year, month: event.start.month, day: event.start.day, slug: event.slug}) } 

map!不是ActiveRecord的方法。

我在我的模型試過這樣:

attr_accessor :link 
def link 
    Rails.application.routes.url_helpers.slug_events_path({year: self.start.year, month: self.start.month, day: self.start.day, slug: self.slug}) 
end 

,雖然我可以在鐵軌控制檯調用它,它不會在to_json呼叫處理。

我意識到我可以使用JavaScript生成此鏈接,但是我覺得從Rails獲得它更加舒適。

有人可以告訴我如何生成新的信息,無論是在模型或控制器,然後把它作爲一個字段,可以轉換爲JSON?

+0

加載ActiveModel檢查串行器:: HTTPS: //blog.engineyard.com/2015/active-model-serializers – xlembouras

+0

我可以建議你將這個問題改寫爲。 「我如何爲軌道中的JSON渲染構建數據?」。 – Stewart

+0

謝謝Stewart,這更具描述性。 – aviemet

回答

0

這裏有一些影響源於一個根源。根本原因是你沒有在MVC中使用V.在幾乎所有情況下,路徑和鏈接都應該在您的視圖中生成。在這裏你試圖在你的控制器和你的模型中生成它們。我建議使用jbuilder。它帶有軌道,是處理這種邏輯的地方。把Jbulder當成json的視圖。使用jbuilder你可以將你的模型字段和任何鏈接直接映射到一個json對象。你甚至不需要再打電話給to_json了。

+0

我很擔心在「V」之外做這件事,所以這是一個很好的建議。 Seralizers的寶石也是如此。我今天回家時會看看他們。 – aviemet

+0

除非您寫入磁盤,否則我不會使用seralizers gem。如果您通過http rails提交數據,則所有內容都已內置。祝您好運! – Stewart

+0

ActiveModel :: Serializers不用於寫入磁盤。它用於生成json。它比jbuilder快得多,但具有更多配置。 – Swards

0

我與斯圖爾特同意在這裏,但只是爲了回答這個問題,我相信你可以用一對夫婦的調整解決您的問題:

# each, not map! 
# add format to url params 

@events.each { |event| event.update_column(:link, Rails.application.routes.url_helpers.slug_events_path({year: event.start.year, month: event.start.month, day: event.start.day, slug: event.slug, :format => :json}) } 

def link 
    Rails.application.routes.url_helpers.slug_events_path({year: self.start.year, month: self.start.month, day: self.start.day, slug: self.slug, format: :json}) 
end