0

環境:

Rails-3.2.12

Ruby-1.9.3

Mongoid-3.1.1

私はモデルを持っています:

class Item
   include Mongoid::Document
   field :name, type: String
   field :type, type: String
end

しかし、ビューに動的フィールドを追加しようとすると、「色」と言って、未定義のメソッドエラーが発生します。

allow_dynamic_fields: true構成ファイルで有効になっています。

_form.html.erb:

<%= form_for(@item) do |f| %>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
<div class="field">
  <%= f.label :type %><br />
  <%= f.text_field :type %>
</div>
<div class="field">
  <%= f.label :color %><br />
  <%= f.text_field :color %>
</div>

すでに色属性を持っているアイテムを編集しようとすると、すべてうまくいきます。item.type に依存するいくつかの動的属性を追加する必要がありますが、次のようなものはありません。

<% if @item[:color] %>
  <%= f.text_field :color %>
<%else%>
  <%= text_field_tag 'item[color]' %>
<% end %>

編集:

エラー:

NoMethodError アイテム #new

31 行目が発生した /app/views/items/_form.html.erb を表示:

undefined method `color' for # 抽出されたソース (31 行目付近):

28:     <%= f.number_field :type %>
29:   </div>
30:    <%= f.label :color %><br />
31:     <%= f.text_field :color %>
32:     <div class="actions">
33:       <%= f.submit %>
34:     </div>
4

1 に答える 1

0

Mongoid docs 言います:

「属性がドキュメントにまだ存在しない場合、Mongoid は getter と setter を提供せず、通常の method_missing 動作を強制します。この場合、他の提供されたアクセサ メソッドを使用する必要があります: ([] および []=) または(read_attribute および write_attribute)。"

あなたができる最も簡単なことは、コントローラーで「色」を設定することです #新しいメソッド write_attribute または []=

@item['color'] = ''

または、'color' 属性を新しい Item シングルトン クラスに動的に追加することもできます。

class << @item
  field :color, type: String
end
于 2013-02-18T15:45:48.860 に答える