Ruby
Rails

[rails] modelでformからの値を取得・加工後に、DBに挿入する

More than 1 year has passed since last update.

はじめに

おそらく、基本中の基本のことではあると思います。。
最近、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を記述してください。

hoge.rb
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

hoge.rb
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に記述しています。