Ruby on rails Rails mongoid动态字段-无方法错误

Ruby on rails Rails mongoid动态字段-无方法错误,ruby-on-rails,mongoid,Ruby On Rails,Mongoid,环境: 轨道-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\u dynamic\u fields:true在配置文件中启用 _form.html.erb: <%=

环境:

轨道-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\u dynamic\u 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 %>

编辑:

错误:

项目中的命名错误#新

显示/app/views/items/_form.html.erb,其中第31行出现:

未定义的方法“颜色”# 提取的源(第31行附近):

28:
29:   
30:
31: 32: 33: 34:
Mongoid文档说:

如果该属性在文档上不存在,Mongoid将不向您提供getter和setter,并将强制执行正常的方法\u缺失行为。在这种情况下,您必须使用其他提供的访问器方法:([]和[]=)或(读\u属性和写\u属性)

您可以做的最简单的事情是在控制器中设置“颜色”#使用write_属性或[]的新方法=

@item['color'] = ''
或者,您可以将“颜色”属性动态添加到新的Item singleton类中:

class << @item
  field :color, type: String
end

class你能给我们你得到的错误的文本吗?*用错误信息编辑是的,这很有效,但我会为项目添加30个属性,难道没有一个不难看的添加属性的方法吗?否则我可以把它们放进模型里,这要看情况而定。如果有一组恒定的属性,则只需将它们添加到模型中即可。如果需要动态定义项属性(例如,在运行时更改它们),那么应该在单例类级别上定义它们。视图层似乎不是定义它们的合适的地方。有一组固定的项目,但是每个项目都有不同的集合,依赖于Type,你应该把它们放进模型中,但是也许你应该考虑创建项目子类,代表每个“类型”。其他一些选项:实现您的Item#method_missing method并动态添加属性,或者让表单帮助程序使用[]/[]=而不是getter/setter
class << @item
  field :color, type: String
end