目次
ActionView
ビューで使えるヘルパーメソッド
truncate
truncateは、30文字をこえた文字列では、前27文字に … を付けて返すメソッド。30文字以下のときは何もしない。なんと多バイト文字にも対応している。
cycle
cycleは、リストを縞々にしたい時など、一行おきにhtmlのクラスを変える用途で使える便利メソッド
Form の selectボックスの作り方
セレクトボックスの項目を作るためには、配列、ハッシュ、配列の配列が使える
<% form_for(@model) do |f| %> <%= f.select :attr1, ["a", "b", "c"], { :include_blank => "選んでね" }, { :class => } %> <%= f.select :attr2, {"a" => "1", "b" => "2", "c" => "3"} %> <%= f.select :attr3, [["a", "1"], ["b", "2"], ["c", "3"]] %> <% end %>
<form .... > <select name="model[attr1]"> <option value="">選んでね</option> <option value="a">a</option> <option value="b">b</option> <option value="c">c</option> </select> <select name="model[attr2]"> <option value="1">a</option> <option value="2">b</option> <option value="3">c</option> </select> <select name="model[attr3]"> <option value="1">a</option> <option value="2">b</option> <option value="3">c</option> </select> </form>
optionsはArrayかHashで受け取る。
Hashの場合、Hashのkeyがoptionのtext、HashのvalueがHTMLのvalueとなる。ハッシュのキーがvalueで、値がtextになりそうな感じだが、逆にすることで同じ値だが違うラベルのoptionを作成可能になっている。ハッシュのvalueはHTMLでもvalueと覚えておこう。
ArrayのArrayの場合、0番目がoptionのtext、1番目がoptionのvalueとなる。
hogesテーブルの一覧をセレクトボックスとする場合は、以下のようにする。
<% form_for(@model) do |f| %> <%= f.select :attr4, Hoge.all.map{ |hoge| [ hoge.name, hoge.id ] } %> <% end %>
または、collection_selectを使ってプロパティを名前で指定できる
<% form_for(@model) do |f| %> <%= f.collection_select :attr4, Hoge.all, :id, :name %> <% end %>
配列で値を送信する
同じ名前で複数の値をsubmitする(fugas[]=1&fugas[]=2 のようなパラメータを送信したい)場合の方法。例えば、HogeとFugaが1対多、または多対多の関連で、チェックボックスをオンにしたら関連を作成する場合(関連先の情報は予め作成済みである)
<% form_for(@hoge) do |f| %> <% Fuga.all.each do |fuga| %> <li><%= check_box_tag "hoge[fugas_id][]", fuga.id, @hoge.fugas.exists?(fuga), { :id => "hoge_fugas_#{fuga.id}" }%><%= fuga.name %> <% end %> <% end %>
パラメータ名を object_name[collection_names_id][]
としておくと。object.update_attributes
でhas_many(through)のデータの関連付けが更新される。
Rails 3
エスケープしつつ改行をbrタグに置き換え
Rails 3の場合は以下のヘルパを作成する
def br str html_escape(str).gsub(/\n/, "<br>").html_safe end
Rails3のビューでは普通に出力すると自動的にエスケープされるが、html_safeで安全とマークされた文字列はエスケープされない