2012年4月27日金曜日

配列をAPIで表示し、モデルでクラス分けする

今度は配列を表示する為にモデル内でクラスを作成して表示させます。 catchとhitはほぼ同じ内容だったので同時に行っていきます。 catch.rbを作成します。
class Catch
  attr_accessor :value
 
  def initialize(value)
    @value = value
  end
 
  def to_i
    @value.to_i
  end
end
model/user.rbに追加します。
before_save do
    self[:catches] = catches.map do |catch|
      catch.to_i
    end
  end

def catches
    case self[:catches]
    when String
      YAML.load(self[:catches]).map { |e| Catch.new(e) }
    when Array
      self[:catches].map { |e| e.kind_of?(Catch) ? e : Catch.new(e) }
    else
      (0..5).map { |n| Catch.new(n * 100) }
    end
  end
 
  def catches=(hash_or_array)
    case hash_or_array
    when Hash
      self[:catches] = hash_or_array.keys.sort.map do |key|
        Catch.new(hash_or_array[key])
      end
    when Array
      self[:catches] = hash_or_array.map { |e| Catch.new(e) }
    end
  end
xml内に追加します。
model/user.rb
xml.catches do
   catches.each do |c|
        xml.catches c.to_i
   end
end
group.rbに追加します(as_json_with_image)
:catches => u.catches,
これでcatchはxmlでもjsonでも配列が表示されました。
次は同じようにhitsもやってみましょう。 his.rbを作成します。
class Hit
  attr_accessor :value
 
  def initialize(value)
    @value = value
  end
 
  def to_i
    @value.to_i
  end
end
model/user.rbに追加します。
self[:hits] = hits.map do |hit|
      hit.to_i
    end
def hits
    case self[:hits]
    when String
      YAML.load(self[:hits]).map { |e| Hit.new(e) }
    when Array
      self[:hits].map { |e| e.kind_of?(Hit) ? e : Hit.new(e) }
    else
      (0..2).map { |n| Hit.new(n * 100) }
    end
  end
 
  def catches=(hash_or_array)
    case hash_or_array
    when Hash
      self[:hits] = hash_or_array.keys.sort.map do |key|
        Hit.new(hash_or_array[key])
      end
    when Array
      self[:hits] = hash_or_array.map { |e| Hit.new(e) }
    end
  end
xml内に追加します。
model/user.rb
xml.hits do
   hits.each do |h|
      xml.hits h.to_i
   end
end
group.rbに追加します(as_json_with_image)
:catches => u.catches,
以上で配列の2つは表示されました。

0 件のコメント:

コメントを投稿