【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で簡単なアプリケーションをつくっていく中で追々書いていきたい。

【Ruby on Rails】簡単なCRUDを書いてみる【学習記録2】

2013.10.17

前回に引き続き。今回は簡単なCRUDメインで。
(そして前回に引き続き「Scaffoldでやれば」って話だけど やっぱり便利なツール使う上で根幹の事はしっかり理解していたいので)

記事の新規登録

articlesコントローラのnewアクション、createアクションをいじる。

def new
  @article = Article.new
end

def create
  @article = Article.new(params[:article])
  if @article.save
    redirect_to @article, notice: "記事を登録しました。"
  else
    render "new"
  end
end

noticeに関してはapplication.html.erbで flash.notice を記述する。
続いてView部分。new.html.erb を用意し、以下のように記述。

<% @page_title = "記事の投稿" %>
<h2><%= @page_title %></h2>

<%= render "articles/form" %>

更新の際にもフォームを使い回せるようにフォーム入力部分のテンプレート _form.html.erb を用意し、レンダリング。_form.html.erbのコードは以下のように記述した。

<%= form_for @article do |form| %>
<table>
<tr>
<th><%= form.label :title %></th>
<td><%= form.text_field :title, size: 50 %></td>
</tr>
<tr>
<th><%= form.label :body %></th>
<td><%= form.text_area :body, rows: 15, cols: 50 %></td>
</tr>
<tr>
<th><%= form.label :expired_at %></th>
<td><%= form.date_select :expired_at, start_year: 1990, end_year: 2030, use_month_numbers: true %></td>
</tr>
</table>
<%= form.submit %>
<% end %>

各属性の名称は i18nあたりをbundle installして ja.ymlなど別ファイルに記述するような感じで良いかも。

(続きを読む…)

【Ruby on Rails】ルーティング、マイグレーション云々【学習記録1】

2013.10.15

最近ようやく少しずつRailsに乗りこなせるになってきたので、ちょっと整理がてらリソースベースのルーティングやらマイグレーションやらの整理をしてみる。

つくるもの

シードデータやらルーティングやらマイグレーションやらいじりつつブログ記事っぽい感じで DBからの簡単な読み出し。それだけ。「Scaffoldでやれば」って話だけど、根幹の仕組みは知っておきたいので。

データの用意

何はともあれmodelの作成。コンソール上で以下のコマンド。


rails g model article

マイグレーション用のスクリプトができたはずなので、db/migrate に移動し スクリプトを編集。


class CreateArticles &lt; ActiveRecord::Migration
  def change
    create_table :articles do |t|
      t.text :title
      t.text :body
      t.date :created_at
      t.date :expired_at
      t.boolean :is_public
      t.timestamps
    end
  end
end

マイグレーションの実行。
(続きを読む…)

文字をぷるぷるさせるjQueryプラグイン Rhythm.js

2013.9.21

jQueryのコードをいじっていた時にふと「そういえば文字がぷるぷるするサイトってあんまり無いよなー」と思った(最も、文字をぷるぷるさせた所で、サイトのユーザにとっては単なるストレスでしか無いけど)。

それにしてもそういうjQueryプラグインが一つぐらいあっても良さそうだなと思って調べたものの、それらしきものが見当たらなかった。文字に魅力的なエフェクトを加えたりするプラグインならあるんだけど、誰もぷるぷるさせようとは思わないみたいだ。

というわけで、せっかくの休日だし つくってみた。

 

Rhythm.js

Rhythm.js

 

使い方は簡単、以下ようにjQueryオブジェクトにメソッドを追加するだけ。

$( some_element ).rhythm();
$( some_element ).rhythm(200); // 200ms間隔でぷるぷるする。

地味にメソッドチェーンもできるようにしています。

$( some_element ).rhythm().html("Foo");

 

く、くだらん。。。(´・ω・`)

というわけで今回は「Rhythm.js」の紹介でした。良い休日を。