はじめてのRuby on Rails、トラブル記録
スポンサーサイト

一定期間更新がないため広告を表示しています

posted by スポンサードリンク | | - | - | - |はてなブックマーク - スポンサーサイト
RailsでSelectタグを使うときのちょっとしたメモ
RailsでSelectタグを使うとき、オプションの指定の仕方に
<%= f.select :min, %w(10 20 30 40 50 60) %>

という方法があるけれど、これだとeditしたときに、データベースに登録済みのデータをデフォルトに指定出きなかった。
データには"60"が入ってるのに、selectタグがそれを指定できなくて勝手に"10"とかなってて、気付かずupdateしてしまったりとか。

<%= f.select :min, [["10",10],["20",20],["30",30],["40",40],["50",50],["60",60], :selected => 60 %>

この形にしたら回避できた。だるい書き方だけど。
ちなみにデフォルトの値の設定は :selected => * でした。
posted by トモト | 23:00 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - RailsでSelectタグを使うときのちょっとしたメモ
accepts_nested_attributes_forの簡単なまとめ
accepts_nested_attributes_forについて、しばらく間をあけるとすぐわからなくなってしまうので軽くメモっておく。

簡単に言うと、accepts_nested_attributes_forはモデルのネスト。
たとえば
[親]user [子]profile
とするとしたら、それぞれ以下のように設定すればいい。

models/user.rb
has_one :profile
accepts_nested_attributes_for :profile


models/profile.rb
belongs_to :user
accepts_nested_attributes_for :user


これを設定すると、userの更新でネストされてるprofileも同時に更新される。
@user = User.find(params[:id])
params = {:user => {:profile_attributes => {:hobby => 'ski'}}}
@user.update_attributes(params[:user])

Viewでフォームを作るときは以下のようにすればいい。
<% form_for @user do |f| %>
  <% f.fields_for :profile do |p| -%>
    <%= render :partial => 'form_profile', :locals=>{:p=>p} %>
  <% end %>
<% end %>


モデルを日本語化したときにどうすんのよってなるので、そんなときはこちらが参考になります。
accepts_nested_attributes_forしたモデルの日本語化



【参考】
Nested_Attributes @Rails詳細解説
http://sora2hs.blog70.fc2.com/blog-entry-438.html
posted by トモト | 16:14 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - accepts_nested_attributes_forの簡単なまとめ
RailsでTimeオブジェクトを任意のタイムゾーンに変換する
あるTimeオブジェクトを、UTCでも今設定されているローカルタイムゾーンでもないタイムゾーンに変換しようとしたときにどうすればいいか、色々試してもうまくいかず悩んでたんだけど、えらく簡単にできてしまう方法があった!


# datetime = 2010-02-10 15:00:00.000 (UTC)
user = User.find(user_id)
time = datetime.in_time_zone(user.timezone) # userごとにtimezoneを持っている
p time => 2010-02-10 21:00:00.000 (+06:00)


ActiveSupportのクラスですが、
Time.in_time_zone(timezone)
でtimezoneのTimeを取得できるという。

検索しても全然出てこなかったんだけど、みんなあまり時差変換なんかしないのか、このクラスがマイナーなのか。
ともあれ、これですっきり書けるので超便利!

【参考】
[ruby on rails] Rails2.1でタイムゾーンを扱う
http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html#M001459
posted by トモト | 14:57 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - RailsでTimeオブジェクトを任意のタイムゾーンに変換する
textareaで入力した文章の改行、htmlタグが反映されるようにする
textareaで入力、保存したデータを普通に表示させると改行とか入れててもなくなってしまうけれど、
それがなくならない方法。

<%= simple_format(でーた) %>


改行は¥nが
に返還されてるみたい。
htmlタグも反映される。
posted by トモト | 23:57 | Rails小ネタ | comments(1) | trackbacks(0) |はてなブックマーク - textareaで入力した文章の改行、htmlタグが反映されるようにする
データ容量を気にしてmigrateファイルを作ってみる
Ruby on Railsに手をつける前から思ってたけど、
Webのプログラムって大部分がデータベースなんだよね。

素朴な疑問。
データベースをいくつも使ったようなサービスを公開するとして、
ユーザーが増えるごとに、たとえばブログとかみたいに投稿されたものとかが増えるごとに
データベース容量が大きくなってくよね。

まあ、必要になればスケールアウトっていうの?データが入りきるように容量大きくするなりするんだろうけど、
使わなくなった不要なデータ(ログ的なものとか)処分したりとか、
データベースの最適化したりとかってしてるのかなあ。一般的に。
Web業界に身を置いたことないのでその辺の運用とかってよくわからないなー。

せめてなるべくデータ容量食わないようにmigrateファイルの設定の段階でもう少し気をつけてみるかと少し調べてみた。
とりあえず、limitを設定してやればその分だけいらない容量確保しなくてすむし、これはやった方がいいだろう。
(今まではろくに設定してなかった汗

それで気づいたけど、
そもそもlimitは何のlimitなんだ?バイト数?桁数・文字数?

調べてみたところ、stringは文字数、integerは桁数らしい。バイト数ではなかった。
MySQLではstringはvarchar(n)となって、limitに設定したのがn=文字数になる模様。
integerの方はちょっと複雑で、limitに設定した数値によってMySQLで宣言される型が変わるみたい。

こちらが参考になりました↓
migrateでのintegerの扱い

必要バイト数と合わせてまとめると、以下のような感じ。
migrateのlimitMySQLのカラム型必要バイト数
0INTまたはINTEGER4
1TINYINT1
2SMALLINT2
3MEDIUMINT3
4..6INTまたはINTEGER4
5..8BIGINT8
9..21INTまたはINTEGER4


重要な点は、
・0だとTINYINTじゃなくて、INTになってる!
・5..8だとなんかBIGINTになってる…!!
・実際にはINT(n)とか桁数が入るけれど、桁数は必要バイト数とは無関係
ということ。

結論:必要バイト数はカラム型で決まるので、そこ気にしてlimitかけよう

じゃ、そーゆーことで。



参考:
migrateでのintegerの扱い
MySQLリファレンスマニュアル 6.2.6. 各カラム型に必要な記憶容量
posted by トモト | 16:01 | Rails小ネタ | comments(0) | trackbacks(0) |はてなブックマーク - データ容量を気にしてmigrateファイルを作ってみる
Rails3レシピブック 190の技
Rails3レシピブック 190の技
ついにRails3対応版が出ました!!
WEB+DB PRESS Vol.58
WEB+DB PRESS Vol.58
Rails2系から3への移行時に知りたいことがひとまとまりになっててよかった!色々ググるよりこれを読む方が早い。
Rubyレシピブック 第3版 303の技
Rubyレシピブック 第3版 303の技
Rubyやるならこのリファレンスは必要。
Search this site