次のような非表示のフォームがあります。
= form_for movie, 'create', method: 'POST' do |f|
- Movie.attribute_names.each do |attr|
= f.hidden_field attr.to_sym, value: movie.send(attr)
= f.submit 'Save this Movie', class: 'button'
この属性の一部はシリアル化された配列ですが、padrino は文字列から配列を解析していないようです。そのため、params に格納されているこの属性ハッシュからレコードを保存しようとすると、データベースでシリアル化エラーが発生します。
{"title"=>"Iron Man 2",
"directors"=>"[\"Jon Favreau\"]",
"cast_members"=>"[\"Robert Downey Jr.\", \"Gwyneth Paltrow\", \"Don Cheadle\", \"Scarlett Johansson\", \"Sam Rockwell\"]",
"genres"=>"[\"Action\", \"Adventure\", \"Sci-Fi\"]",
"length"=>"124",
"trailer_url"=>"http://imdb.com/video/screenplay/vi1172179225/",
"year"=>"2010",
"languages"=>"[\"English\", \"French\", \"Russian\"]"}
この醜いコードのチャンクを使用して、配列文字列を解析できます。
Movie.serialized_attributes.keys.each do |k|
movie[k] = movie[k].gsub(/\"|\[|\]/, '').split(', ') if movie[k]
end
しかし、それはばかげているようです.sinatraはそれを自動的に解析する必要があります(またはそうではありませんか?)、またはフォームを間違った方法で生成している可能性があります. この動作を修正するにはどうすればよいですか?
注:次のようなフォームを生成しようとしました:
- Movie.attribute_names.each do |attr|
- if Movie.serialized_attributes.keys.include? attr
= f.hidden_field attr.to_sym, value: movie.send(attr), multiple: true
- else
= f.hidden_field attr.to_sym, value: movie.send(attr)