0

目前我正在使用 Last.fm 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 个事件放入这个模型中。

4

2 回答 2

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 %>
于 2012-06-28T05:19:45.197 回答
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.

于 2012-06-28T23:54:09.670 回答