10

次のように、Rails で ActiveRecord の「シリアル化」機能を使用しています。

class User < ActiveRecord::Base
    serialize :favorite_colors, Array
    ....
end

だから私たちは持つことができます

u = User.last
u.favorite_colors = [ 'blue', 'red', 'grey' ]
u.save!

したがって、基本的に ActiveRecord は上記の配列をシリアル化し、favorite_colors という 1 つのデータベース フィールドに格納します。

私の質問は、ユーザーが自分の好きな色をフォームに入力できるようにするにはどうすればよいですか? 一連のテキストフィールドを使用していますか? そして、それらが入力されたら、どのようにフォームに表示して編集できるようにしますか?

これは、シリアル化された配列属性の Rails フォーム ヘルパーに関する質問です。

ありがとう

4

3 に答える 3

4

複数選択のHTML フィールドが必要な場合は、次を試してください。

= form_for @user do |f|
  = f.select :favorite_colors, %w[full colors list], {}, :multiple => true

simple_form gemを使用している場合は、オプションをチェック ボックスとして簡単に表示できます。

= simple_form_for @user do |f|
  = f.input :favorite_colors, as: :check_boxes, collection: %w[full colors list]
于 2012-11-22T19:08:12.967 に答える
3

ビューで配列を「フラット化」し、コントローラーで配列を再構成することで、この問題を解決しました。

モデルにもいくつかの変更が必要です。以下を参照してください。

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 に簡単に変更できます。しかし、私たちにはまだ限界があります。この制限を削除する方法についての提案は大歓迎です。

この投稿がお役に立てば幸いです。

于 2012-11-23T17:23:56.593 に答える
2

AR 属性へのアクセスを許可するには、次のように付与する必要があります。

class User < ActiveRecord::Base
  serialize :favorite_colors, Array
  attr_accessible :favorite_colors
  ....
end
于 2012-11-22T18:32:43.703 に答える