自分用メモ。
しばらく前にとある勉強会で「継続」なるものを知った。これを使うと便利な場面もあるらしく、コード例を交えつつ説明してくれた。
しかし、元々知識のない自分にはイマイチピンと来なかった。そんな時に誰かがこのサイトを教えてくれた。分かりやすい。ただし、概念が何となく分かったからって、継続を使ったコードが書ける気はしない。
自分用メモ。
しばらく前にとある勉強会で「継続」なるものを知った。これを使うと便利な場面もあるらしく、コード例を交えつつ説明してくれた。
しかし、元々知識のない自分にはイマイチピンと来なかった。そんな時に誰かがこのサイトを教えてくれた。分かりやすい。ただし、概念が何となく分かったからって、継続を使ったコードが書ける気はしない。
タイトル通りRuby on Railsで"You are being redirected"という画面が表示されるけど、実際には待ってもリダイレクトされないで、そのページのリンクをクリックしないと次のページに遷移しない。
You are being redirectedで検索するとRoRの特定のバージョンでそういうバグがあったらしいけど、自分の場合は違う。
あまり詳しくは調べてないけど、redirect_toを使うと、HTTPレスポンスのヘッダで301だか302が返されると共に、ボディに前述の内容が含まれてクライアントに返されるらしい。
何らかの理由で、上手くリダイレクトがされない場合に、上の内容が表示される。
RubyのTwitter関連ライブラリには色々あるみたいだけど、Twitter4Rを使った。
先ほどのページを見ると0.3.0が最新のように見えるが、良く読むと「最新版はダウンロードサイトをチェックしてくれ」みたいに書いてある。ちなみに、ダウンロードサイトをみると 0.5.3 が最新版のようにも見えるが、gem installしてみたら0.6.0がインストールされた。
Twitter API、OAuthについての基礎知識はあるものとする。特にClientとBrowserの違いが分かってないと混乱するかも。
今回はClient形式のアプリを作るものとする。まぁボットみたいなものを想像してもらえばいいかと。
ちなみに、"Twitter4R"で検索して出てくるページは結構パスワード認証を使ってるけど、今はパスワード認証は廃止になっていて、APIにアクセスするのにはOAuthを使う必要があるので注意。
相変わらずボチボチLiftを触ってる。Lift 2.2 M1から入った便利な機能として、CSS Selectorがある。詳しくはWikiの該当のエントリを見てもらうとして、それとAjaxを組み合わせる方法。
Lift 2.2
<form>タグを使った例はSimply Liftの4.8に載っているんだけど、普通のボタン(ajaxButton)を使いたかった。
DBのテーブルよりデータを取得して、HTMLの表にして出力。各行についているボタンをクリックすると、その行のデータに対する何らかの処理が行われるようにしたい。
結論から言うと簡単。
LiftにはMappedEnumという型がある。型引数の1つでEnumerationの子クラスを取る。モデルクラスのフィールドにそれを指定すると、フォームではEnumerationの各要素がプルダウンで選択できるようになる。
MappedEnumのシグニチャは以下の通り。
abstract class MappedEnum[T<:Mapper[T], ENUM <: Enumeration] (val fieldOwner: T, val enum: ENUM) extends MappedField[ENUM#Value, T]
"ruby scraping"で検索するとこのページが引っかかる。いくつかのツールの紹介と簡単な比較をしてるんだけど、本当にさわりだけなのでやっぱり自分である程度試してみる必要がある。あと、若干情報が古い。
自分は結論から言うとMechanizeを使う事にした。理由は以下の通り。
タイトル通り。検索するとLiftを使ってる人にはお馴染みの武田ソフトさんのページが出てくる。基本はそれでOKなんだけど、バージョンが違うとちょっと違うので一応メモ。
以前ブログエントリに書いたCRUDifyは、ちょっとしたデータを作る時とかに便利。ただ、日付あるいは時刻型(MappedDate, MappedDateTime)のフィールドにうまく値が設定できなかった。MM/dd/YYYYで入力したんだけど…
で、解決方法は、文字列を日付にパースするメソッド及び日付を文字列にするメソッドをそれぞれおオーバーライドする。
object dateField extends MappedDate(this) {
import java.text.{SimpleDateFormat, ParseException}
import java.util.Date
val dateFormat = new SimpleDateFormat("yyyy/MM/dd")
override def format(d: Date): String = dateFormat.format(is)
override def parse(s: String): Box[Date] = {
try {
Full(dateFormat.parse(s))
} catch {
case e: ParseException => Empty
}
}
}