ビューで配列を「フラット化」し、コントローラーで配列を再構成することで、この問題を解決しました。
モデルにもいくつかの変更が必要です。以下を参照してください。
class User < ActiveRecord::Base
serialize :favorite_colors, Array
def self.create_virtual_attributes (*args)
args.each do |method_name|
10.times do |key|
define_method "#{method_name}_#{key}" do
end
define_method "#{method_name}_#{key}=" do
end
end
end
end
create_virtual_attributes :favorite_colors
end
上記のようなメソッドを定義しない場合、Rails はビュー内のフォーム要素の名前 (「favorite_colors_0」など) について文句を言うでしょう (以下を参照)。
ビューでは、10 個のテキスト フィールド、favorite_colors_0、favorite_colors_1 などを動的に作成します。
<% 10.times do |key| %>
<%= form.label :favorite_color %>
<%= form.text_field "favorite_colors_#{key}", :value => @user.favorite_colors[key] %>
<% end %>
コントローラーでは、save または update_attributes を呼び出す前に、favorite_colors_* テキスト フィールドを配列にマージする必要があります。
unless params[:user].select{|k,v| k =~ /^favorite_colors_/}.empty?
params[:user][:favorite_colors] = params[:user].select{|k,v| k =~ /^favorite_colors_/}.values.reject{|v| v.empty?}
params[:user].reject! {|k,v| k=~ /^favorite_colors_/}
end
私が行っていることの 1 つは、10 をハードコーディングすることです。これにより、favorite_colors 配列に含めることができる要素の数が制限されます。フォームでは、10 個のテキスト フィールドも出力します。10 を 100 に簡単に変更できます。しかし、私たちにはまだ限界があります。この制限を削除する方法についての提案は大歓迎です。
この投稿がお役に立てば幸いです。