2013-05-06 6 views
3

У меня есть 3 модели - стандартов, слоев и layers_assocs. Стандарты имеют много слоев через layer_assocs, а остальные тривиальны. layers_assocs таблицы хранит standards_id, layer_id и visible булева, а слоев таблицы просто посмотреть таблицу с name (и автоприращением id).Fields_for с вложенным атрибутом, has_many через ассоциацию

На странице параметров стандартов у меня есть флажок, который обновляет вложенный атрибут :visible. Я ищу способ показать имя связанного слоя в метке формы. В настоящее время у меня есть это для флажка:

<%= f.fields_for :layers_assocs do |assoc| %> 
    <%= assoc.check_box :visible %> 
<% end %> 

Как бы отобразить имя, связанное слой с layers_assocsbelongs_toслоев ассоциация является тайной. Я могу показать layer_id с этим

<%= assoc.text_field :layer_id %> 

Но пытаться использовать это как целое число для отображения имени через слои, как standard.layers[assoc.layer_id] или standard.layers[:layer_id] не летает. assoc - объект FormBuilder, поэтому я не уверен, что делать. Осмотр assoc выплескивает огромный объект со всем в стандарте.

Я проверил rails api on fields_for и this question, не повезло. Либо :name, либо :visible не определено.

ответ

6

Got it. Должно быть, это был кофе.

<% @standard.layers_assocs.each do |assoc| %> 
    <%= f.fields_for :layers_assocs, assoc do |layer_field| %> 
    <%= layer_field.label assoc.layer.name %> 
    <%= layer_field.check_box :visible %> 
    <% end %> 
<% end %> 

Для этого флажка требуется видимый атрибут в качестве ключа. f.check_box layer_assoc.visible просто подумает, что вы пытаетесь заставить его «истина» или «ложь». Проблема с получением имени тогда заключается в том, что когда :visible находится в правильной области, layer_assoc.layer.name недоступен в блоке fields_for, потому что layer_field является объектом FormBuilder, а не объектом layers_assoc. Вышеописанное гарантирует, что обе области доступны, а выход не преувеличен. f.fields_for :layers_assoc выводит столько дубликатов, сколько есть объектов в стандарте layer_assocs. f.fields_for :layers_assoc, assoc ограничивает его до нужной суммы.

Обратите внимание, что метка формы неправильно прикреплена к for="..." в соответствующем флажке HTML. Я могу справиться с этим, но дайте мне знать, если вы знаете лучший способ.