2012年10月25日

annotate(annotate_models)ってgemが地味に便利

Railsで開発してると、 「このModelのテーブルにどんなカラムを作ったっけ」 って思うことがよくある。

しかし、いちいちrails dbとかrails cとかで中身を見に行くのもだるい。

そんな時にannotateさんに頑張ってもらう。

導入は簡単。

とりあえず 前回のやつ に導入する。 まあgemなので、毎度おなじみGemfileに

gem 'annotate'

と追記して

$ bundle install

でも叩いておけば導入できる。

それから

$ bundle exec annotate

とでも叩けば

Annotated (1): Item

という感じで、何の情報を更新したかを教えてくれる。

で。実際にそのapp/models/item.rbファイルを見てみると

# == Schema Information
#
# Table name: items
#
#  id         :integer          not null, primary key
#  name       :string(255)
#  price      :integer
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

class Item < ActiveRecord::Base
  attr_accessible :name, :price
  strip_commas_from :price
end

こんな感じでコメントとしてファイル先頭にテーブルのスキーマ構造が投入されると。

さらにtest/unit/item_test.rbも

# == Schema Information
#
# Table name: items
#
#  id         :integer          not null, primary key
#  name       :string(255)
#  price      :integer
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

require 'test_helper'

class ItemTest < ActiveSupport::TestCase
  # test "the truth" do
  #   assert true
  # end
end

こんな感じになってるし test/fixtures/items.ymlも

# == Schema Information
#
# Table name: items
#
#  id         :integer          not null, primary key
#  name       :string(255)
#  price      :integer
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html

one:
  name: MyString
  price: 1

two:
  name: MyString
  price: 1

こんな感じ。

あとはrspecを使ってる場合でも spec/models/item_spec.rbに書き込まれたはず。

あとはfactory_girlなどなどにも対応していたり、なんか色々オプションあるけど https://github.com/ctran/annotate\_models を見たら、英語だけどこのぐらいはわかるはずだから頑張ってね(丸投げ)

posted by 麦汁 at 23:23 | Comment(0) | TrackBack(0) | rails | このブログの読者になる | 更新情報をチェックする

2012年10月20日

Railsでinputの数値をカンマ区切りにするの巻。ついでに右寄せ。

ある日麦汁さんは出費をひたすら記録するだけのRailsアプリを作っていました。

彼は基本的にケチなので いつも一つの商品に対して1,000円に満たない程度の物しか購入していませんでした。

しかしある時、気前良く10万ほどの出費をしました。本当はしてませんけどしました。 そんな大きな出費をしたわけですから、記録しないわけにはいきません。

そんなわけで彼は自作のアプリに出費項目として登録しようとしました。

ところがなんということでしょうか。 10万なんていう数字は、あまりにも「0」の数が多過ぎて 麦汁さんの頭では 10000が正しいのか1000000が正しいのかがわかりません。

「せめて、せめてカンマ区切りにさえなってくれれば!!」

そんなわけで実装します。

環境は rails3.2.8で適当に

$ rails new cashbook

して、さらに適当に

rails g scaffold item name price:integer

したところから始めます。

とりあえずは、inputがカンマ区切りにさえなればいいので http://www.decorplanit.com/plugin/ から「autoNumeric」というjQueryのプラグインを拾って来ます。

普通にDLしたらautoNumeric-1.7.5.js.txtとかなってるので 拡張子の.txtを削除して 適当にRAILS_ROOT/app/assets/javascriptsにでも放り込みましょう。

で、そんでもって RAILS_ROOT/app/assets/javascripts/items.js.coffeeに 以下の記述を付け加えましょう。

$ ->
  $('input[type=number]').autoNumeric()

やったね! これで普通に数字を入れるだけで勝手に簡単にカンマ区切りになるよ!!

でもフォーカスを外したらケツに勝手に「.00」とか付けてくるよ! 許せないね!

ってことで記述を

$ ->
  $('input[type=number]').autoNumeric(aPad: false)

に変更。 これで余計な「.00」はついてこないよ! やったね! でも数値なんだから右寄せ表示がいいよね!

ってことで RAILS_ROOT/app/assets/stylesheets/items.css.scssを

input[type=number] {
  text-align: right;
}

に書き換え。 これでinputの表示にはとりあえず満足。

さあ。いざ登録しよう! Nameには「大きな出費」、 Priceには「100,000」(カンマは自動入力)と入力して、submitボタンを押そう!!

すると、なんということでしょう!

Item was successfully created.

Name: 大きな出費

Price: 100

なんで100が入っとんねん(怒) どうやらRailsがカンマは小数点だと思い込んでる模様。くそったれええええええ。

そこでおもむろにGemfileに以下の記述を追加しました。

gem "ar_strip_commas"

そうしてbundleコマンドを実行しました。 bundleを実行したのでサーバも当然再起動します。

さらにapp/models/item.rbを以下の様に書き換えました。

class Item < ActiveRecord::Base
  attr_accessible :name, :price
  strip_commas_from :price
end

よし。これで大丈夫のはず! というわけで改めて Nameには「大きな出費」 Priceには「100,000」(カンマは自動入力)と入力して update!

今度は

Item was successfully updated.

Name: 大きな出費

Price: 100000

む。登録したらカンマの区切りがなくて「0」の数がわからん!

まあここは大人しくapp/views/items/show.html.erbを以下のように編集。

<p id="notice"><%= notice %></p>

<p>
  <b>Name:</b>
  <%= @item.name %>
</p>

<p>
  <b>Price:</b>
  <%=number_with_delimiter @item.price %>
</p>

price のところに number_with_delimiter というhelperを適用しただけ。 あとindex.html.erbも同様にしておいた方がいいですねっと。

以上で、カンマがないと0の数が数えられないかわいそうな麦汁さんは救われました。 やったね!

ちなみにChromeでinput type='number'しているところにこれをやろうとしたら 4桁以上の数値を入力できなくなるので大分悲しい。

posted by 麦汁 at 22:35 | Comment(1) | TrackBack(0) | rails | このブログの読者になる | 更新情報をチェックする