Ruby on rails Rails mongoid动态字段-无方法错误
环境: 轨道-3.2.12 Ruby-1.9.3 Mongoid-3.1.1 我有一个模型: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: <%=
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