Rails で twitter bootstrap を使うときの備忘

railstwitter bootstrap を使おうとすると、エラーメッセージが綺麗に表示されないので、どうするかのメモがき

Railsが規定で用意している error タグを抑止

application.rb に以下を追記するだけ

ActionView::Base.field_error_proc = Proc.new { |html_tag, instance| html_tag }

これでエラーになった項目が

<div class="field_with_errors"></div>

で囲まれることがなくなります。

自前で error を追加する

そのままだと、エラーの項目がまっさらになってしまうので、自前で _form.html.erb などで

 <div class="control-group <%= @member.errors[:name].empty? ? '' : 'error' %>"> 

のようにすることで、twitter bootstrap っぽい雰囲気でエラーが表示される。

datepickerを使う

Rails の select_date ヘルパーはイマイチなので、それっぽいやつを
http://www.eyecon.ro/bootstrap-datepicker
から拾ってきて、vendor/assets/javascripts と vendor/assets/stylesheets にファイルを起く。less は気にしない。

app/assets/javascripts/application.js と app/assets/stylesheets/application.css で適当に datepicker を require しておく

app/views/tasks/new.html.erb

<div class="control-group <%= @task.errors[:due_date].empty? ? '' : 'error'%>" >
  <%= f.label :due_date, class: 'control-label' %>
  <div class="controls">
    <%= f.text_field :due_date, class: 'span2', value: Date.today.strftime('%Y/%m/%d') %>
  </div>
</div>

こんなん書いて、対応する input タグに対して

$ ->
  $("input[id='task_due_date']").datepicker({ format: 'yyyy/mm/dd' })

て感じか。

ダイアログを変更する

モーダルダイアログとしてhttp://twitter.github.com/bootstrap/javascript.html#modalsを使う

これも単純に提供されている js ファイルを vendor/assets/javascripts に置く。例えばscaffoldで作成される一覧画面の削除ボタンを変更して、モーダルダイアログを表示させる

変更前

<td><%= link_to '削除', task, method: :delete, confirm: '本当に削除しますか?' %>

変更後

<%= content_tag :div, '削除', class: 'btn btn-mini btn-danger',
                data: {toggle: "modal", target: "#delete_#{task.id}"} %>

ただの div タグになったので、ボタンを押して呼び出されるtargetを別に用意する

<div class="modal hide" id="delete_<%= task.id %>">
  <div class="modal-header">
    <button class="close" data-dismiss="modal">x</button>
    <h3>削除してもよいですか?</h3>
  </div>
  <div class="modal-footer">
    <%= link_to "削除", task, method: :delete, class: 'btn btn-danger' %>
    <%= link_to "キャンセル", nil, class: 'btn' %>
  </div>
</div>

これを _delete_task.html.erb とでもしておいて、

<%= render partial: 'delete_task', locals: {task: task} %>

などとして書いておく