独自に定義したModelは、一定の基準を満たせばTimelineに表示することができます。その基準を満たしていない場合、タイムラインに表示することはできません。

このセクションでは、実際にカスタムModelをタイムラインに表示しているRSSプラグインを参考にして、その方法を解説します。

以下のコードは、RSSプラグインのItemクラスです。

class Item < Retriever::Model
  include Retriever::Model::MessageMixin

  register :rss, name: "RSS Topic"

  field.string :guid
  field.string :link
  field.string :title, required: true
  field.string :description
  field.time   :created
  field.has    :site, Plugin::RSS::Site, required: true

  def to_show
    @to_show ||= self[:title].gsub(/&(gt|lt|quot|amp);/){|m| {'gt' => '>', 'lt' => '<', 'quot' => '"', 'amp' => '&'}[$1] }.freeze
  end

  def user
    site
  end
end

MessageMixin

タイムライン、すなわちGUIにModelを表示するには、多くのメソッドを提供しなければいけません。

それらのメソッドはたいてい固定値を返していれば良いため、そういったメソッドをほとんどすべて実装したRetriever::Model::MessageMixinをincludeし、そこから必要なメソッドをオーバライドしていきます。

実装すべきメソッド

MessageMixinは、必要なメソッドをすべて実装してはくれません。デフォルト値を返すようにしてくれるだけなので、デフォルト値が存在しないようなメソッドは定義する必要があります。具体的には、次のメソッドです。

to_show

表示するテキストをStringで返すメソッドです。 最初の例では、RSSのタイトルから、エスケープされた記号をもとに戻したものを返しています。

ここで返した文字列は、mikutterのタイムライン上には、ツイートの本文のように表示されます。

user

ユーザ名、ユーザアイコンなどを表示するために使われます。

created

このModelが示すリソースが作成された時刻をTimeのインスタンスで返します。 例ではcreatedメソッドを直接定義していませんが、このコードでcreatedメソッドが定義されています。

field.time   :created

詳しくは Modelのfield を参照してください。

定義すべきメソッドの代わりにフィールドを使う

createdのように、実装すべきメソッドを定義する代わりに、その名前のフィールドを作成するというテクニックもあります。これはuserにも同じテクニックを利用できます。単純にコードが短くなるため、憶えておくべきテクニックですが、以下の様な場合には使うべきではありません。

to_showフィールドは定義せず、必ずメソッドを使う

to_showは本文を表すフィールドから取ってきた値を加工するなどして、タイムラインに表示する文字列を返すメソッドにするべきです。RSSの例でも表示するテキストのために加工をしています。

加工されることを期待しているので、to_showという名前のフィールドを作って手を抜かないようにしましょう。次に上げるような理由からも、to_showフィールドは定義してはいけません。

タイムラインに表示するために、明らかに格納しているものとは違う名前をつける

例にしたRSSプラグインでは、userメソッドの戻り値は、siteフィールドの内容そのままです。 siteフィールドをuserという名前に変更すればこのようなことをしなくて良くなりますが、これは悪いアイデアです。

なぜならsiteフィールドには、Plugin::RSS::Siteのインスタンスが格納されるようになっており、ユーザではありません。RSSフィードのアイコンをタイムラインに表示するためにuserメソッドを定義しているだけです。このような都合のためにフィールド名を変えるべきではなく、何を格納するかわかりやすい名前をつけるべきです。

もちろん、SNSのプラグインのためにModelを定義しているなら、投稿者としてuserフィールドを定義するのは妥当です。Modelの性質によって適切な方法は変わってきます。

register

ツイートのように、直接タイムラインに表示されるModelは、定義の中でregisterメソッドを呼んでおきましょう。

register :rss, name: "RSS Topic"

registerメソッドの詳しい情報はメタ情報の記事を参照してください。

参考