Rails + jQueryで Edit in Place(その場編集) UI の実装

2013.10.29

基本的な部分はおさえたので そろそろ参考書から離れて 自分でつくってみようかなと思う。

そういうわけで現在は簡単なタスク管理のWebアプリケーションを実装中。

ユーザにストレスが無いよう利便性を高めるために以下のような仕様を実装したい。

【仕様】

1. 項目の既存の属性をクリックしたらテキストエリアに切り替わって編集モード。

2. テキストエリアからフォーカスを外すか、エンターキーを押した場合 更新 ( ただし文字数0の場合は更新せず元に戻す )

3.  Escapeキーを押した場合は更新せず元に戻す

疑問に思った事や困った事、以下。

jQueryでupdate?

$.ajax を使う。jQueryの場合はデフォで「PUT」をサポートしてくれているので UPDATEも安心。

そんなわけで最初のajaxの中身は以下のような形になった。

(続きを読む…)

RESTful Web APIs 読書会( 第二回 )に参加してきた

2013.10.25

RESTful-Web-APIs

RESTful Web APIs 読書会 #2 に参加してきた。

RESTful Web API?

要約すると以下のような感じ。

・Webサービスだとハイパーリンクとかをたどって ユーザは目的達成できるけど、APIの場合って  多くの場合ドキュメントがWeb上に別個に公開されていて、URLだけ見てもわからない上に、ドキュメントを見ても個々の機能がどのように関連しているかがわかりにくいよね

・そもそも そういうWeb APIのあり方って 自己記述性の点でどうなの?(=RESTfulじゃないよね)

・自己記述的なものが含まれていて、最初のURLさえあれば使い方がわかるようなAPIが理想的だよね

そこで RESTful Web APIの著者は Collection+JSON というフォーマットを推奨している。

Collection+JSONとは?

JSONが汎用的でプレーンテキストを扱うものだとしたら、Collection+JSON とは JSONよりも限定的で 「Web上のリソースの検索可能なリストを公開するための規格」である。

HTTPヘッダでは Content-Type: application/vnd.collection+json という形で渡される。

(続きを読む…)

【Ruby On Rails】エラーページの実装【学習記録5】

2013.10.22

セッションまわりやら何やらいじっていたら大分いじれるようになってきた。最初こそ手こずったものの、基本的な機能であれば人に説明できるレベルになったかな…という所感。

正直学習ペース遅いよなーとは思いながらも、それでも自分が使う道具に関しては 人に教えられるくらいには仕組みや概念ごとの繋がりを理解しておきたいよね という思いもあるので。

というわけで、今回はRailsにおけるエラーページの独自実装ということで話を進めていく。

まずは controllers/application.rb に、以下の二つのクラスを定義。一つは404用、もう一つは403用。

class NotFound;end
class Forbidden;end

Applicationコントローラ内に以下のコードを追加。

rescue_from NotFound, with: :err_not_found
rescue_from Forbidden, with: :err_forbidden
 :
 :
def err_not_found(exception)
  render "errors/not_found", status: 404
end

def err_forbidden(exception)
  render "errors/forbidden", status: 403
end

これだけだとルーティングエラー等、根幹の部分で起きるエラーまでは拾ってくれない。
(続きを読む…)

【Ruby on Rails】テーブルに無い項目をフォームで扱う場合【学習記録4】

2013.10.20

引き続きRailsの勉強。

例えば前回までにつくった「article」モデルの「掲載期限」について、「掲載期限を指定しない」というチェックボックスを追加する場合を考える。チェックがされている場合は 掲載期限を保存しない。

この場合 テーブルの項目として新たにカラムを一つ追加するのも無駄があるので、アクセサメソッドを使用する。

まずはViewに変更を加える。 articles/_form.html.erb の掲載期限の部分に対し、noexpire というチェックボックスを実装。

<td>
<%= form.check_box :noexpire %> <%= form.label :noexpire %><br>
<%= form.date_select :expired_at, start_year: 1990, end_year: 2030, use_month_numbers: true %></td>

Articleモデルに以下のアクセサメソッドを追加。

def noexpire
  expired_at.blank?
end

def noexpire(=val)
  @noexpire = val.in?([1,"1",true])
end

フォーム項目と同名のアクセサメソッドを定義した。getterの方では フォームをページで読み込んだ際に返す値を記述し、setterの方では フォームをPOSTする際に @noexpire というインスタンス変数に対して「フォームから渡された値が 1,”1″,true  のいずれかならtrue、そうでなければfalse」を代入。

ここでバリデーションが実行される前に行われる処理を記述する。

before_validation :fix_expired_at
:
(略)
:
def fix_expired_at
  self.expired_at = nil if @noexpire
end

fix_expired_at では、POST時にsetterで定義された@noexpireの値がtrueなら(つまり「掲載期限を指定しない」にチェックされた状態なら)、データベースに格納する expired_at の値を「nil」にする、という処理が行われている。

因みに、何故ここに「self」をつける必要があるのか?以下のようにしてもいいんじゃないの?

def fix_expired_at
  expired_at = nil if @noexpire
end

…と思ったけれど、上記がダメな理由は Ruby の根本原則を考えると自明で、上記のようにすると expired_at が 一関数内のローカル変数になってしまう という単純な理由だった。

【Ruby on Rails】バリデーションについて【学習記録3】

2013.10.19

今回はバリデーションまわりの勉強。代表的なバリデーションについて以下にまとめてみた。

必須項目チェック

まずは一番基本、必須項目チェック。必須項目の場合は「presence」という属性を「true」にしてあげる。


validates :column, presence: true

create時のみ、もしくはupdate時のみ必須にしたい場合は以下のように記述する。


validates :column, presence: { on: :create } # create時のみ必須

validates :column, presence: { on: :update } #update時のみ必須

長さチェック

長さチェックの場合は length を使用。最小の場合は minimum, 最大の場合は maximum を設定。


validates :column, length: { minimum: 10, maximum: 50 } # 10 ~ 50 文字

空欄の場合はチェックを行わない…というようにしたい場合は「allow_blank」属性に true を指定。


validates :column, length: { minimum: 10, allow_blank: true }

正規表現

正規表現でのバリデーションをかける場合は format を使用する。


validates :column, format: { with: /正規表現/, message: "エラーの時の文言" }

範囲

範囲を指定する場合は inclusion を使用し、以下のように 「in」に範囲オブジェクトを渡す。


validates :column, inclusion: { in: (0..100) } # 1 ~ 100の範囲内かどうか

チェックされているかどうか

これは「利用規約に同意」とかで結構使いそうな感じ。これには「acceptance」を使用。


validates :column, acceptance: true # チェックがついていればOK

他にも色々あるけれど、所感としてよく使うのは上に挙げたものかな。

上記に挙げたもの以外のバリデーションについては 実際にRailsで簡単なアプリケーションをつくっていく中で追々書いていきたい。