2011年3月25日金曜日

Rails3 text_field と text_field_tag の違い

なんか、今更だけどやっと違いが分かったのでメモ。

text_field_tag

<%= text_field_tag 'user_id' %>
<input id="user_id" name="user_id" type="text" />

text_field

<%= text_field 'person', 'user_id' %>
<input id="person_user_id" name="person[user_id]" size="30" type="text" />

違いは
  • size 属性が自動でつく。
  • POST パラメータがハッシュ形式になる。params[:user_id] と params[:pserson][:user_id] の違い

一番大きいのは、パラメータ値がハッシュ形式で取得できるかどうかの部分。

他の ヘルパメソッドもすべて同じ。(password_field や check_box など)

Rails 1.x から時間の合間見て触ってきて、やっと理解できた俺っていったい。。。(by キートン山田)

Rails3 fields_for

使い道は思いつかないが、便利そうなのでメモ。
form_for は <form></form> を生成するが、fields_for は <form> を生成しない。
で、form_for と同じ POST 時のパラメータ値を Hash 形式にできる。

■form_for

<%= form_for :person do |f| %>
  ID: <%= f.text_field :user_id %>
  Name: <%= f.text_field :name %>
<% end %>
<form accept-charset="UTF-8" action="/form/input" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="authenticity_token" type="hidden" value="Rtch9vUwmDWmniDy/IsMetQhhfnbzp9lHXV6YAe2PwA=" /></div>
  <input id="person_user_id" name="person[user_id]" size="30" type="text" />
  <input id="person_name" name="person[name]" size="30" type="text" />
</form>

■fields_for

<%= fields_for :person do |f| %>
  ID: <%= f.text_field :user_id %>
Name: <%= f.text_field :name %>
<% end %>
ID: <input id="person_user_id" name="person[user_id]" size="30" type="text"/><br/>
Name: <input id="person_name" name="person[name]" size="30" type="text"/>

以前書いた check_box の配列化なんかのコードが
<%= fields_for :dinner do |field| %>
  <%= field.check_box "zensai" %>前菜
  <%= field.check_box "supe" %>スープ
  <%= field.check_box "main" %>メインディッシュ
  <%= field.check_box "dezart" %>デザート
  <%= field.check_box "drink" %>ドリンク
<% end %>
と、なんかスッキリと書ける。

Rails3 HTML5 タグの出力

Rails3 で HTML5 サイト作成のため、イロイロ調査した結果をメモ。

HTML5 タグを吐き出す基本的なやり方は、
<%= text_field_tag 'find', nil :type=>'search' %>
<input id="find" name="find" type="search"/>
と、text_field_tag の html_options で type 属性を指定する。
Rails ではちゃんと上記コードを簡略化するためのヘルパメソッドが用意されている。


HTML TagFormHelper Method
<input type="search"/>search_field
<input type="tel"/>telephone_field(phone_field)
<input type="url"/>url_field
<input type="email"/>email_field
<input type="number"/>number_field
<input type="range"/>range_field

日付系 (date, datetime 等) や color といったものは見当たらなかった。
なので、ヘルパメソッドが存在しないタグは text_field を直接利用するしかない(?)

2011年3月22日火曜日

Rails チェックボックスの配列化(修正)

昔、こんな記事を書いたが、
こんな配列化は意味がないことに気づいたので加筆。

check_box_tag

以下のように記述すると、
<%= check_box_tag "print" %>印刷する
生成される HTML は
<input id="print" name="print" type="checkbox" value="1" />印刷する
となる。
submit した際の parameter 値は
選択時 => "print"=>"1"
非選択時 => "print"=>nil
となる。
ruby では false と nil は false 扱いとなるため、単純に if で params[:print] と判定すれば
ON, OFF の判定ができるため、簡単に記述できる。

check_box

以下のように記述すると、
<%= check_box "print", "enabled" %>印刷する
生成される HTML は
<input name="print[enabled]" type="hidden" value="0" /><input id="print_enabled" name="print[enabled]" type="checkbox" value="1" />印刷する
となる。
submit した際の parameter 値は
選択時 => "print"=>{"enabled"=>"0"}
非選択時 => "print"=>{"enabled"=>"1"}
となる。
要は、check_box タグを利用すると、checkbox を Hash でパラメータ渡しできるようになる。
なので、配列化したい場合は、それぞれの項目に名前をつけてやって Hash の key として扱ってやればよい。

例) ディナーのコースを選択する。必要なコースがあればチェックをつける
<%= check_box "dinner", "zensai" %>前菜
<%= check_box "dinner", "supe" %>スープ
<%= check_box "dinner", "main" %>メインディッシュ
<%= check_box "dinner", "dezart" %>デザート
<%= check_box "dinner", "drink" %>ドリンク
これで、ディナーパラメータ値にハッシュとして配列化されてコントローラに渡ってくる。

無理に配列化するメリットは何もない。意味不明な index で値を取得する必要も
ないし、未選択時に飛んでこないなんてこともない。

2011年3月5日土曜日

Ubuntu 10.04 で快適音楽生活

Ruby, scala の開発しかやってなかったけど、遊びでつかってみようと思い色々やり始めた。
mp3 を管理する際のメモ書き。(イロイロやらないといけないので)
* 基本的に追加ソフトとかは極力インストールしない方針です
なので、利用するアプリは
  • Rhythmbox 0.12.8 (音楽ファイル管理)
  • Brasero (CD作成ツール)
となる。

1.mp3 の ID3 タグを編集
文字化けしている mp3 が多数あったのでそれを一つ一つ直していくのは時間の無駄と思い
Easy TAG をインストール (いきなりソフトを追加してしまった)
sudo aptitude install easytag
[アプリケーション]→[サウンドとビデオ]から Easy TAG を起動して、
[設定]→[設定]を開き、[ID3タグの設定]タブを選択。
ID3v1 タグの ID3x1.x でタグを書き込むのチェックを外す。
ID3タグ読み込み時の文字セットの規格外チェックを選んで、日本語(Shift-JIS)を選択。
これで選択した mp3 ファイルのタグ情報が文字化けしないで表示されているので、
[ファイル]→[ファイルの強制保存]を選んでタグを書き込む。

2.Brasero での音楽CD作成
この御時世に未だ音楽CDなるものを作成しているのですが。。
mp3 → 音楽CD へのライティングは普通にできないので、コーデック類をインストールする。
sudo aptitude install gstreamer0.10-ffmpeg gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multivers
これで、Brasero の音楽CD 作成プロジェクトを選択して mp3 ファイルをドロップすれば作成できるようになる。

2011年3月3日木曜日

Ruby: 指定された日が何月の何周目かを求める

タイトルのようなものが必要になった。
考えるのが面倒くさかったため、ネットで答えを探したが
うまく見つけることができなかったため、固い頭を使って
考えてみた。
その結果を晒します。

■仕様
  • 月曜日基点で考える。
  • 月曜日が所属する月にその週は属する。
例でいうと以下のとおり。(2011-03-03の場合)
2011年
2月-3週 21 22 23 24 25 26 27
2月-4週 28 1 2 3 4 5 6
3月-1週 7 8 9 10 11 12 13

実際のコードは以下。
def mweek(date)
  day = date - (date.cwday - 1)
  base_month = day.month

  week = 0
  (1..5).each do |index|
    day -= 7
    if base_month != day.month
      week = index
      break
    end
  end

  { :month => base_month, :week => week}
end

解説:
cwday で週を数字化して月曜日が 基点になるように補正。日付を移動させる。
あとは基点月が所属する月から何周目かをカウントするだけ。
復帰値は月と何周目かの Hash 値。複数の復帰値が返せる curl や scala が便利と感じる。
*よくテストしていないので、BUGがあるかもしれません。

2011年2月23日水曜日

Ubuntu 10.04 Google Chrome に java-plugin インストール

いろいろと面倒くさかったためメモ。

1.sun-java インストール

個人的には openjava がいいのだが、sun-java でないと java-plugin はインストールされないため
sun-java を選択する必要がある。が、apt で管理されていないため、リポジトリを追加する。

sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
sudo aptitude update
sudo aptitude install sun-java6-jdk
java で開発作業もするので jdk をインストール。jdk がいらない場合は sun-java6-plugin で OK。

2.Plugin の設定

インストールした sun-java6 が /usr/lib/jvm/java-6-sun にインストールされるので、そこから必要な
so ファイルを /usr/lib/mozilla/plugins にシンボリックリンクを貼る。

sudo ln -s /usr/lib/jvm/java-6-sun-1.6.0.24/jre/lib/i386/libnpjp2.so .

Google Chrome が起動されている場合、再起動して about:plugins で確認。
http://speed.rbbtoday.com/cgi-bin/rbb003/exec.cgiでスピード測定とかしてみる。