2010-02-03 3 views
9

Я искал и много пробовал, но я не могу выполнить это, как я хочу .. так вот моя проблема.Использование полей из ассоциации (has_many) модели с formtastic в рельсах

class Moving < ActiveRecord::Base 
    has_many :movingresources, :dependent => :destroy 
    has_many :resources, :through => :movingresources 
end 

class Movingresource < ActiveRecord::Base 
    belongs_to :moving 
    belongs_to :resource 
end 

class Resource < ActiveRecord::Base 
    has_many :movingresources 
    has_many :movings, :through => :movingresources 
end 

Movingresources содержит дополнительные поля, как quantity. Мы работаем над взглядами на «счет». Благодаря formtastic, чтобы упростить всю связь, просто напишите

<%= form.input :workers, :as => :check_boxes %> 

и я получаю настоящий хороший список флажков. Но до сих пор я не обнаружил: как я могу использовать дополнительные поля из «movingresource», рядом или под каждым флажком, мои желаемые поля из этой модели?

Я видел разные подходы, в основном с ручным циклом по массиву объектов и созданием соответствующих форм, используя: для части form.inputs или нет. Но ни одно из этих решений не было чистым (например, работало для редактирования, но не для нового, потому что требуемые объекты не были созданы или сгенерированы, а их создание вызвало беспорядок).

Я хочу знать ваши решения для этого!

ответ

8

Хорошо, я пропустил революцию accepts_nested_attributes_for, это объясняет, почему это не работает.

Это заставило меня большой шаг вперед, но я думаю, что где-то я до сих пор есть некоторые осложнения со своими сложными отношениями^_^

class Moving < ActiveRecord::Base 
    has_many :movingworkers, :dependent => :destroy 
    has_many :workers, :through => :movingworkers 
    accepts_nested_attributes_for :movingworkers 
end 


<% form.inputs :for => :movingworkers do |movingworker| %> 
    <%= movingworker.inputs :worker, :quantity %> 
<% end %> 
+1

Обратите внимание, что фактическую базовую модель можно получить непосредственно через формообразователь, таким образом: 'movingworker.object'. См. Строку 1244 в файле action_view/helpers/form_helper.rb: 'attr_accessor: object_name,: object,: options' –

+0

вы правы. Многие вещи изменились, и я узнал много нового, это теперь очевидно для меня, но это нужно упомянуть. – pduersteler

1

Если поля не существуют в новом представлении, вы можете просто проверить, является ли он новым (new_record?) и представить другой набор полей (если вы обертываете в частичный, может быть довольно чистый подход).

+0

спасибо, вы правы. Но поскольку я работаю с рельсами, я привык к простоте, поэтому я прошу других решений выбрать мой любимый. И я также думаю, что это может помочь некоторым другим людям. – pduersteler

4

Formtastic'S: label_method вариант может помочь. Например.

<%= form.input :movingworkers, :label_method => :worker %> 

или

<%= form.input :movingworkers, :label_method => Proc.new { |x| "#{x.worker} #{x.quantity}" } %>