2013-03-16 4 views
0

У меня есть 3 модели, которые содержат ассоциацию has-many-through.fields_for builder метод .объект не позволяет мне извлекать значения объекта

код модели выглядит следующим образом:

ItemAttrVal Модель (таблица перехода)

class ItemAttrVal < ActiveRecord::Base 
    belongs_to :attr_name 
    belongs_to :registry_item 
end 

RegistryItem Модель

class RegistryItem < ActiveRecord::Base 
    has_many :item_attr_vals 
    has_many :attr_names, :through => :item_attr_vals 
    accepts_nested_attributes_for :item_attr_vals, :allow_destroy => :true 
end 

AttrName Модель

class AttrName < ActiveRecord::Base 
    has_many :item_attr_vals 
    has_many :registry_items, :through => :item_attr_vals 
end 

RegistryItem использует fields_for следующим образом:

<%= item.fields_for :item_attr_vals do |iav| %> 
    <%= render 'item_attr_val_fields', :f => iav %> 
<% end %> 

В парциальное, это выглядит следующим образом:

<% logger.debug "object type is: #{f.object}"%> 
<% logger.debug "some details are: #{f.object.attr_name_id}--"%> 
<%= f.select :attr_name_id, options_from_collection_for_select(AttrName.all,"id","description"), :selected => f.object.attr_name_id, :prompt => "Select an attribute" %> 
<%= f.text_field :raw_value %> <br /> 

1-ые 2 отладочные линии бит, что мой вопрос о том, но это первый относится к третьей строке. Там, я пытаюсь обеспечить выпадающее поле выбора с «предварительно выбранным» значением. Это так, что когда пользователь редактирует RegistryItem, будет отображаться их ранее выбранное имя_признака.

Я пытаюсь использовать f.object.attr_name_id, чтобы установить это значение, однако на самом деле он не правильно выбрал ранее выбранное значение, а вместо этого просто переходит к 1-му.

1-ые две отладочные строки были тогда я пытаюсь, чтобы убедиться, что мой f.object метод работал ...

Когда я посмотрел в моих журналах, я вижу следующее:

object type is: #<ItemAttrVal:0x007fb3ba2bd980> 
some details are: -- 

В основном, 1-я строка показывает мне, что я получаю ItemAttrVal . Вторая строка, похоже, не извлекает никакой информации для нее.

Я также использовал отладчик, чтобы проверить, и там, я могу использовать display f.object.attr_name_id, чтобы показать мне точное значение, что я ожидал ...

Этот вид сводится к двум вопросам ...

  1. Почему я не могу получить значения f.object?
  2. Я пытаюсь сделать строку 3 (<%= f.select :attr_name_id, options_from_collection_for_select(AttrName.all,"id","description"), :selected => f.object.attr_name_id, :prompt => "Select an attribute" %>) неправильно, и на самом деле есть лучший способ сделать это?

Заранее благодарен!

ответ

0

Оказывается, я поместил :selected в неправильном месте ...

Оригинал:

<%= f.select :attr_name_id, options_from_collection_for_select(AttrName.all,"id","description"), :selected => f.object.attr_name_id, :prompt => "Select an attribute" %> 

Должно быть:

<%= f.select :attr_name_id, options_from_collection_for_select(AttrName.all,"id","description", f.object.attr_name_id), :prompt => "Select an attribute" %> 

Закрепление, что решить мою проблему, имена атрибутов теперь появляются как и ожидалось ранее сохраненных атрибутов.

Он по-прежнему не отвечает на мой первоначальный запрос о том, почему я не могу получить значения для распечатки f.object, но по крайней мере исходно-оригинальная проблема была решена.

0

вам нужно использовать Params [: attr_name_id] в вашем options_from_collection_for_select

<%= f.select :attr_name_id, options_from_collection_for_select(AttrName.all,"id","description", params[:attr_name_id].to_i), :prompt => "Select an attribute" %> 

надеюсь, что это помогает

+0

Я проверил хэши params, и attr_name_id тоже не отображается. Я * угадываю * это потому, что я пытаюсь управлять им как частью его «родительской» формы, а не ее собственной. –

+0

Тем не менее, я благодарю вас за то, что он просматривал ваш ответ, что заставило меня понять, что я поместил опцию ': selected' в неправильную часть метода. >. < –

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