Archive

Posts Tagged ‘rails’

ActiveSupportで日時変換

9月 2nd, 2009

Railsではたまに1.week.from_nowといった書き方を見ます
これはActiveSupportによってnumericクラスが拡張されているもので、様々な指定方法があります

例えば、?時からその日中(23:59まで)のデータをfindしたい場合、

RAILS:
  1. # 12:00~23:59まで
  2. date = Time.parse("12:00")
  3. cond = []
  4. cond <<"created_at> ? AND created_at <?"
  5. cond <<date
  6. cond <<(date + 1.day).beginning_of_day
  7. @data = Model.find(:all, :conditions => cond)

といった書き方が出来ます
beginning_of_dayは時間の部分をその日の00:00に変換したtimeオブジェクトを返します(Time型のみ)

Rails の Date, Time 拡張

Controllerから呼ばれるHelperで

8月 22nd, 2009

今日の作業で良くわかんなかったとこ

AjaxリクエストへHTML(tableのセル)を返す処理で、以前はControllerに書いていた処理をHelperに移してみた
その際、折角だからViewでも一部被ってた部分をマージしてlink_toやimage_tagなどのHelperメソッドに置き換えた
(ViewでもそのHTMLが欲しい時にHelperを呼ぶようにするため)
すると、Viewからは普通に呼べるのだけど、AjaxでControllerからHelperを呼ぶとlink_toやimage_tagがうまく動かなかった
色々includeとかしてみたけどlink_toで必ずnil.url_forとなってしまったので諦めた(結局HTMLべた書きした)

Railsのform_forでの注意

8月 4th, 2009
RAILS:
  1. # view
  2. <% form_for :hoge, :url => {:action => :update} do |f| %>
  3.   <% f.hidden_field :id, {:value => @hoge.id} %>
  4.   <% f.text_field :name, {:value => @hoge.name} %>
  5.   <% f.submit %>
  6. <% end %>

RAILS:
  1. # controller
  2. def update
  3.   if params[:hoge]
  4.     hoge = Hoge.find_by_id(params[:hoge][:id])
  5.     hoge.attributes = params[:hoge]
  6.     hoge.save!
  7.   end
  8. end

のような書き方をするとうまく保存されません
WARNING: Can't mass-assign these protected attributes: id
のような警告をlogに吐きます
どうやらidは上書きも認められてないようです
hidden_fieldではなく、form_forの引数として渡すとうまく行きます

RAILS:
  1. # view
  2. <% form_for :hoge, :url => {:action => :update, :id => @hoge.id} do |f| %>
  3.   <% # f.hidden_field :id, {:value => @hoge.id} %>
  4.   <% f.text_field :name, {:value => @hoge.name} %>
  5.   <% f.submit %>
  6. <% end %>

RAILS:
  1. # controller
  2. def update
  3.   if params[:hoge]
  4.     # hoge = Hoge.find_by_id(params[:hoge][:id])
  5.     hoge = Hoge.find_by_id(params[:id])
  6.     hoge.attributes = params[:hoge]
  7.     hoge.save!
  8.   end
  9. end

これでうまいこと更新出来ます

,

Railsのcheck_box_tag

8月 3rd, 2009
RUBY:
  1. <%= check_box_tag "hoge[check]" %>

だとチェックしてもうまく行かない(hoge[check]がtrueになってない)
しっかりvalueを設定する必要がある

RUBY:
  1. <%= check_box_tag "hoge[check]", 1, false %>
  2. <%= check_box_tag "hoge[check]", true %>

valueがtrueだとちゃんとチェックボックスの値を受け取れるみたい
3つ目の引数はcheckedに当たります

Railsでiphoneからのアクセスを振り分け

7月 31st, 2009

Rails2.3.3で確認
[追記1] set_iphone_formatにviewファイルを振り分ける記述を追記
[追記2]振り分けれてなかったので修正…

RUBY:
  1. # config/initializers/mime_types.rb
  2. # 以下の行のコメントを外す
  3. Mime::Type.register_alias "text/html", :iphone
  4.  
  5. ###
  6. # application_controller.rb
  7.   # iphone/ipod touchからのアクセスかどうか(ちょっと適当っぽい)
  8.   def is_iphone_request?
  9.     request.user_agent =~ /(Mobile\/.+Safari)/
  10.   end
  11.  
  12.   # iphone/ipod touchだったらiphone向けに表示切換え
  13.   def set_iphone_format
  14.     if is_iphone_request?
  15.       request.format = :iphone
  16.     end
  17.   end
  18.  
  19. ###
  20. # hoge_controller
  21.   def index
  22.     ...
  23.     respond_to do |format|
  24.       format.html
  25.       format.iphone
  26.     end
  27.   end

こんな感じにしとくと、iphoneからのアクセスでは
views/layout/application.iphone.html.erb
views/hoges/index.iphone.html.erb
を描画してくれます

#iphone用のディレクトリを用意してそこに*.iphone.html.erbを全部ぶっ込んで使うにはどうすればいいんだろう…
#iphone用コントローラとか作りたくないし;

,