2013-02-18 3 views
0

ENV:Rails не Mongoid динамических полей - нет ошибки метода

Rails-3.2.12

Рубин-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 %> 

EDIT:

Ошибка:

NoMethodError в пунктах # новых

Отображение /app/views/items/_form.html.erb, где строка # 31 поднята:

неопределенный метод `цвета» для # Извлеченного источника (около линии № 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> 
+0

не могли бы вы дать нам текст ошибки вы получаете * – alestanis

+0

отредактирован с сообщением об ошибке – xinu

ответ

0

Mongoid Docs говорит:

«Если атрибут не существует в документе, Mongoid не предоставит вам получателей и сеттеров, и будет обеспечивать нормальное поведение method_missing. В этом случае вы должны использовать другие предоставленные методы доступа: ([] и [] =) или (read_attribute и write_attribute). "

Самый простой, что вы можете сделать, это установить„цвет“в контроллере #new метод с использованием write_attribute или [] =

@item['color'] = '' 

Или вы можете просто динамически добавить„цвет“атрибут к новому пункту синглтон класс:

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

да, что работает, но у меня будет как 30 атрибутов для элемента, разве там не уродливый способ добавить атрибуты? иначе я могу просто положить их в к модели – xinu

+0

Это зависит. Если существует постоянный набор атрибутов, вы должны просто добавить их в свою модель. Если вам необходимо динамически определить атрибуты Item (например, изменить их во время выполнения), то вы должны определить их на уровне одноэлементного класса. Просмотр слоя не представляется подходящим местом для их определения. – cthulhu

+0

есть постоянный набор элементов, но каждый элемент будет иметь различный набор из них, в зависимости от типа – xinu

Смежные вопросы