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

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 に答える
0

モデルを持っているのは良い考えだと思います。私が見ることができるいくつかの利点があります

1 - 他のオブジェクトと同様にオブジェクト指向の方法でデータにアクセスできます

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 に答える