フォームオブジェクトを使って、date型のカラムを保存しようとしたところ、
フォームオブジェクトのクラスでインスタンスを生成してしまうとdate型のカラムが認識されないので、
unknown attribute 'expire_date(1i)' for ItemsTag.
のようにエラーが出てしまう。。
なので、コントローラーのcreateメソッドのなかで、インスタンス生成した際に、date型にあらかじめ変形させておいた値をmergeさせてフォームオブジェクトに渡してあげる、ということをしていきます。
[やること]
songsテーブルに追加した、date型 「 t.date :sales_date, null: false」
を保存させたい。
[方法]
[フォームのビュー]
<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>
[コントローラー]
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させて
一緒に渡す。
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アクションの引数に保存するカラムを記述する。
以上です。