#はじめに
おそらく、基本中の基本のことではあると思います。。
最近、formからの値を加工し、データベースに保存することがあったため、備忘録として残しておきたいと思っています。
もっといい方法やそもそも間違っている内容がある場合は、どしどしコメントをお待ちしています!
#1.コールバックを設定
2012年の記事ですが、コールバックに関して大変わかりやくまとめていただいています。
http://www.techscore.com/blog/2012/12/25/rails%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%BE%E3%81%A8%E3%82%81/
今回は、before_save
をmodelに設定します。
before_saveは、paramsをDBに保存する直前に指定したプログラム(今回の例では、:change_date_format)を実施するコールバック関数です。
before_save
を設定すると、createとupdateのどちらも場合にも、適用されます。
updateの時飲みに適用したい場合には、before_update
を記述してください。
class Hoge < ActiveRecord::Base
before_save :change_date_format
end
#2.formからの値を受け取る
こちらは、self.published_at
のように記述します。
modelでは、selfはつまり、modelそのものを意味するらしいので、model_name.published_atでもいいかと思います。
published_at
の箇所には、値を加工した後に入れたいDBのカラム名を指定してください。
self.column_name || model_name.column_name
class Hoge < ActiveRecord::Base
before_save :change_date_format
before_save :set_end_of_month
private
def change_date_format
row_data = self.published_at
fixed_data = row_data.in_time_zone('Tokyo')
self.published_at = fixed_data
end
def set_end_of_month
self.closed_at = self.published_at.end_of_month
end
end
以上が、modelでformからの値をmodelで取得・加工して、DBに保存する方法です。
controllerでも[:published_at]で値を取得し、加工し、modelに飛ばす方法ができるのですが、
汚くなりそうなので、modelに記述しています。