Railsではたまに1.week.from_nowといった書き方を見ます
これはActiveSupportによってnumericクラスが拡張されているもので、様々な指定方法があります
例えば、?時からその日中(23:59まで)のデータをfindしたい場合、
RAILS:
-
# 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 拡張
rails
今日の作業で良くわかんなかったとこ
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
RAILS:
-
# 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 %>
RAILS:
-
# 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の引数として渡すとうまく行きます
RAILS:
-
# 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 %>
RAILS:
-
# 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
これでうまいこと更新出来ます
rails, view
RUBY:
-
<%= check_box_tag "hoge[check]" %>
だとチェックしてもうまく行かない(hoge[check]がtrueになってない)
しっかりvalueを設定する必要がある
RUBY:
-
<%= check_box_tag "hoge[check]", 1, false %>
-
<%= check_box_tag "hoge[check]", true %>
valueがtrueだとちゃんとチェックボックスの値を受け取れるみたい
3つ目の引数はcheckedに当たります
rails
Rails2.3.3で確認
[追記1] set_iphone_formatにviewファイルを振り分ける記述を追記
[追記2]振り分けれてなかったので修正…
RUBY:
-
# 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用コントローラとか作りたくないし;
iphone, rails