Railsではたまに1.week.from_nowといった書き方を見ます
これはActiveSupportによってnumericクラスが拡張されているもので、様々な指定方法があります
例えば、?時からその日中(23:59まで)のデータをfindしたい場合、
# 12:00~23:59まで
date = Time.parse("12:00")
cond = []
cond << "created_at > ? AND created_at < ?"
cond << date
cond << (date + 1.day).beginning_of_day
@data = Model.find(:all, :conditions => cond)
といった書き方が出来ます
beginning_of_dayは時間の部分をその日の00:00に変換したtimeオブジェクトを返します(Time型のみ)
Rails の Date, Time 拡張
今日の作業で良くわかんなかったとこ
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べた書きした)
# view
<% form_for :hoge, :url => {:action => :update} do |f| %>
<% f.hidden_field :id, {:value => @hoge.id} %>
<% f.text_field :name, {:value => @hoge.name} %>
<% f.submit %>
<% end %>
# controller
def update
if params[:hoge]
hoge = Hoge.find_by_id(params[:hoge][:id])
hoge.attributes = params[:hoge]
hoge.save!
end
end
のような書き方をするとうまく保存されません
WARNING: Can’t mass-assign these protected attributes: id
のような警告をlogに吐きます
どうやらidは上書きも認められてないようです
hidden_fieldではなく、form_forの引数として渡すとうまく行きます
# view
<% form_for :hoge, :url => {:action => :update, :id => @hoge.id} do |f| %>
<% # f.hidden_field :id, {:value => @hoge.id} %>
<% f.text_field :name, {:value => @hoge.name} %>
<% f.submit %>
<% end %>
# controller
def update
if params[:hoge]
# hoge = Hoge.find_by_id(params[:hoge][:id])
hoge = Hoge.find_by_id(params[:id])
hoge.attributes = params[:hoge]
hoge.save!
end
end
これでうまいこと更新出来ます
<%= check_box_tag "hoge[check]" %>
だとチェックしてもうまく行かない(hoge[check]がtrueになってない)
しっかりvalueを設定する必要がある
<%= check_box_tag "hoge[check]", 1, false %>
<%= check_box_tag "hoge[check]", true %>
valueがtrueだとちゃんとチェックボックスの値を受け取れるみたい
3つ目の引数はcheckedに当たります
Rails2.3.3で確認
[追記1] set_iphone_formatにviewファイルを振り分ける記述を追記
[追記2]振り分けれてなかったので修正…
# config/initializers/mime_types.rb
# 以下の行のコメントを外す
Mime::Type.register_alias "text/html", :iphone
###
# application_controller.rb
# iphone/ipod touchからのアクセスかどうか(ちょっと適当っぽい)
def is_iphone_request?
request.user_agent =~ /(Mobile\/.+Safari)/
end
# iphone/ipod touchだったらiphone向けに表示切換え
def set_iphone_format
if is_iphone_request?
request.format = :iphone
end
end
###
# hoge_controller
def index
...
respond_to do |format|
format.html
format.iphone
end
end
こんな感じにしとくと、iphoneからのアクセスでは
views/layout/application.iphone.html.erb
views/hoges/index.iphone.html.erb
を描画してくれます
#iphone用のディレクトリを用意してそこに*.iphone.html.erbを全部ぶっ込んで使うにはどうすればいいんだろう…
#iphone用コントローラとか作りたくないし;