LoginSignup
10
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-12

はじめに

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

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8