2012-06-28 31 views
0

目前我正在使用Last.fm api在我的控制器中返回音樂會數據(返回一個散列),並在循環這個散列的視圖中返回我想要的數據。我希望這個音樂會數據變得更加動態,並將所有內容都放到一個模型中。我該怎麼做呢?我應該在控制器中執行此操作還是在模型中執行此操作?如何將API數據放入模型中?

這裏是我的代碼

# app/controllers/events_controller.rb 
class EventsController < ApplicationController 
    def index 
    @events = @lastfm.geo.get_events("Chicago",0,5) 
    respond_with @events 
    end 
end 

# app/views/events/index.html.erb 
<% @events.each do |event| %> 
    Headliner: <%= event["artists"]["headliner"] %> 
<% end %> 

在這個例子中,我會想與頂篷作爲一個參數事件模型,並把事件的所有5到這個型號的例子。

回答

0

我相信這是一個好主意,有一個模型。有幾個好處,我可以看到

1 - 你可以訪問數據OO象其他對象

2 - 如果你有一些業務邏輯(例如:計算),你可以做到這一點在模型本身出搞亂你的看法

3 - 它的清潔和乾燥

例模型類將(這是不是一種工作模式,但只是爲了給ü的想法:))

class Event 
    attr_accessor :headliner 


    def self.event_list(limit = 5) 
    lastfm.geo.get_events("Chicago",0,limit) 
    end 

end 

所以你可以清理你的視圖

<% Event.each do |event| %> 
    Headliner: event.headliner 
<% end %> 

我覺得你明白我的意思:)

+0

這並不完全回答我的問題。我現在明白一個模型是正確的選擇,但我怎樣才能真正在模型中分配頂篷。我感謝幫助! – dskaplan88

0

這很難徹底地回答這個問題沒有關於last.fm API更多的知識。作爲一般規則,您希望將大部分複雜的邏輯和關係數據保留在模型中。

例如,您已經知道您需要一個Event模型,但它看起來也可能需要Artist模型。你可能最終是這樣的:

# app/models/artist.rb 
class Artist 
    attr_accessor :name 

    def initialize(name) 
    self.name = name 
    end 
end 

# app/models/event.rb 
class Event 
    attr_accessor :artists 

    def initialize(attributes) 
    @attributes = attributes 

    self.artists = attributes['artists'].map do |artist_name| 
     Artist.new(artist_name) 
    end 
    end 

    def headliner 
    @headliner ||= self.artists.detect do |artist| 
     @attributes['headliner'] == artist.name 
    end 
    end 
end 

# app/controllers/events_controller.rb 
class EventsController < ApplicationController 
    def index 
    @events = @lastfm.geo.get_events('Chicago', 0, 5).map do |event_attributes| 
     Event.new(event_attributes) 
    end 

    respond_with @events 
    end 
end 

你也可能想看看ActiveModel,這對模型不在數據庫支持,而且不能從ActiveRecord::Base繼承了一些有用的功能。

相關問題