1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

フォームオブジェクトを使ったdate型カラムの保存方法

Posted at

フォームオブジェクトを使って、date型のカラムを保存しようとしたところ、
フォームオブジェクトのクラスでインスタンスを生成してしまうとdate型のカラムが認識されないので、

unknown attribute 'expire_date(1i)' for ItemsTag.

のようにエラーが出てしまう。。

なので、コントローラーのcreateメソッドのなかで、インスタンス生成した際に、date型にあらかじめ変形させておいた値をmergeさせてフォームオブジェクトに渡してあげる、ということをしていきます。

[やること]
songsテーブルに追加した、date型 「 t.date :sales_date, null: false」
を保存させたい。

[方法]

[フォームのビュー]

new.html.erb
   <div class="weight-bold-text"> 
        リリース日
       <span class="indispensable">(必須)</span>
      </div>
    <div class='input-sales-wrap'>
      <%= raw sprintf(
                  f.date_select(
                    :sales_date,
                    class:'select-birth',
                    use_month_numbers: true,
                    prompt:'--',
                    start_year: (Time.now.year),
                    end_year: 1930,
                    date_separator: '%s'),
                  "<p> 年 </p>", "<p> 月 </p>") + "<p> 日 </p>" %>
    </div>

[コントローラー]

songs_controller.rb

 def create
    @song = SongsArtist.new(song_params)
    date = params.require(:songs_artist).permit(:sales_date)
    sales_date = Date.parse( date["sales_date(1i)"] + "-" + date["sales_date(2i)"] + "-" + date["sales_date(3i)"] )
    @song = SongsArtist.new(song_params.merge(sales_date: sales_date))
end

 def song_params
    params.require(:songs_artist).permit(:name, :text, :image, :translate, :youtube_url, :genre_id, :art_name,:featuring_name,:producer_name).merge(user_id: current_user.id)
  end

sales_date以外は、song_paramsメソッド内でpermitのなかに入れてフォームオブジェクトに渡すが、
sales_dateは、
date = params.require(:songs_artist).permit(:sales_date)
sales_date = Date.parse( date["sales_date(1i)"] + "-" + date["sales_date(2i)"] + "-" + date["sales_date(3i)"] )
この2行の記述でdate型に変更し、
@song = SongsArtist.new(song_params.merge(sales_date: sales_date))
フォームオブジェクトに渡す値であるsong_paramsに、date型に変更したsales_dateをmergeさせて
一緒に渡す。

song_artist.rb

class SongsArtist
  include ActiveModel::Model
  attr_accessor :name, :text, :image, :genre_id, :translate, :youtube_url, :sales_date,:art_name,:producer_name,:featuring_name, :user_id,:song_id
  validates :name, :text,:image,:genre_id, presence: true
  validates  :genre_id, numericality: { other_than: 1 }
  def save
    artist = Artist.where(art_name: art_name).first_or_initialize
    artist.save
    featuring = Featuring.where(featuring_name: featuring_name).first_or_initialize
    featuring.save
    producer = Producer.where(producer_name: producer_name).first_or_initialize
    producer.save
    song = Song.create(name: name, text: text, image: image, genre_id: genre_id, translate: translate, youtube_url: youtube_url, sales_date: sales_date,user_id: user_id,producer_id: producer.id,featuring_id: featuring.id)
    SongArtistRelation.create(song_id: song.id, artist_id: artist.id)
  end
end

フォームオブジェクトの記述は、普段と変わらず、 attr_accessorでコントローラーから渡ってきたカラムを許可し、createアクションの引数に保存するカラムを記述する。

以上です。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?