2015-11-09 2 views
-1

Есть ли способ сделать fields_for a has_many ассоциация без перехвата всех связанных элементов?Fields_for без цикла do


У меня очень похожая ситуация, рассмотренному here:

У меня есть Person модель, с несколькими родственными моделями (Address, Phone number, Jobtitle ...), и на форме я бы только как создавать новые записи. Новая запись должна быть предварительно заполнена из существующей записи. У меня есть вспомогательная функция, которая улавливает нужные данные, я просто хочу, чтобы fields_for отображал это без необходимости прохождения цикла do.

+0

О чем вы говорите? –

+0

Вероятно, перемещение по существующим данным:/ –

+0

'<% = f.fields_for: адреса do | a | %> "перечисляет все адреса для этого человека. Я не хочу этого делать, я уже задал данные в другом месте. – thenapking

ответ

2

Вот что вам нужно:

#app/models/person.rb 
class Person < ActiveRecord::Base 
    has_many :addresses 
    has_many :phone_numbers 
    has_many :job_titles 

    accepts_nested_attributes_for :addresses, :phone_numbers, :job_titles 
end 

#app/controllers/people_controller.rb 
class PeopleController < ApplicationController 
    def edit 
     @person = Person.find params[:id] 
     @person.addresses.build #-> this adds onto the existing "addresses" for that person 
    end 
end 

Это позволит вам использовать следующее:

#app/views/people/edit.html.erb 
<%= form_for @person do |f| %> 
    <%= f.fields_for :addresses do |a| %> 
     <% if a.object.new_record? %> 
      <%= a.text_field :street %> 
      <%= a.text_field :town %> 
     <% end %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 

Это должно выводиться только входы для new ассоциативного объекта (тот, который вы построили). Это немного взломано, но я получаю вашу проблему - вы только хотите показать новые входы (существующие не должны показывать).

Сохранение этого будет Добавить ассоциативную запись на ваш Person объект. Существующие еще будут существовать.

+0

Это, по сути, то, что я делаю, хотя я обнаружил, что использование 'a.object.new_record?' Не работает во всех ситуациях и уничтожит данные во время обратной связи формы, если проверка не завершилась. Я выбираю правильные данные в переменную, называемую data_object, а затем проверяю 'a.object.attributes == data_object.attributes'. Это «цикл», который я хотел бы удалить. – thenapking

+0

Вы имеете в виду, что хотите сохранить свой код в курсе, тем самым устраняя функцию циклирования, которая заставляет ее сканировать уже присвоенные атрибуты? –

+0

Вы ударили ноготь точно по голове. Проблема в том, что в этом проекте модель People имеет 16 ассоциаций, каждая из которых может иметь 5 или 6 исторических записей. У меня есть время загрузки страницы к северу от 10-х из-за этого перечисления :( – thenapking

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

  • Нет связанных вопросов^_^