Вложенная модельная форма, не отправляющая все - PullRequest
0 голосов
/ 22 ноября 2011

Я слышал об этом сообществе, слушая Hypercritical, и я рад присоединиться к своему первому вопросу.Я работаю над своим первым приложением rails, и у меня возникла проблема, которую я не могу решить.Я наблюдаю за Railscast, Lynda.com и Googling в течение нескольких дней, но я все еще не могу понять, как создать форму, которая будет обновлять мои has_many: через ассоциации сразу.Позвольте мне попытаться объяснить, что я делаю.

Моя цель: Фирма, в которой я работаю, предоставляет множество «предложений по обслуживанию», и я хочу иметь возможность создавать новое предложение услуг наодна страница, и он создает контакты и другую информацию, которая связана с ней.Дополнительная информация, такая как «контакты», будет храниться в их собственных таблицах, поскольку на них могут ссылаться многие «Предложения по обслуживанию».

Проблема: Когда я отправляю форму «Услуга»Предлагаемые »поля отправляются и вводятся в базу данных, а поля для« Бизнес-разработчика »нет.Очевидно, я хотел бы, чтобы все было занесено в соответствующую таблицу и чтобы идентификаторы были связаны в соединительной таблице.Я был бы очень признателен за любую информацию, которую вы могли бы предоставить.

То, что я имею до сих пор: То, что вы видите ниже, - это предложения услуг и разработчики бизнеса.Со временем я буду добавлять контакты, фотографии и файлы, но я подумал, что начну просто и продолжу свой путь.

Модели:

class ServiceOffering < ActiveRecord::Base
 attr_accessible :name, :description
 has_many :business_developer_service_offerings
 has_many :business_developers, :through => :business_developer_service_offerings
 accepts_nested_attributes_for :business_developer_service_offerings
end

class BusinessDeveloper < ActiveRecord::Base
 attr_accessible :first_name, :last_name
 has_many :business_developer_service_offerings
 has_many :service_offerings, :through => :business_developer_service_offerings
end

class BusinessDeveloperServiceOffering < ActiveRecord::Base
 belongs_to :business_developer
 belongs_to :service_offering
end

Контроллер:

def new
 @service_offering = ServiceOffering.new
 @service_offering.business_developers.build
end

def create
 @service_offering = ServiceOffering.new(params[:service_offering])
 if @service_offering.save
  redirect_to(:action => 'list')
 else
  render('new')
 end
end

Вид:

<%= form_for((@service_offering), :url => {:action => 'create'}) do |f|%>
    <p>
    <%= f.label :name%>             
    <%= f.text_field :name %>

    <%= f.label :description%>  
    <%= f.text_field :description %>
    </p>

<%= f.fields_for :business_developer do |builder| %>
    <p>
    <%= builder.label :first_name%>
    <%= builder.text_field :first_name %>

    <%= builder.label :last_name%>
    <%= builder.text_field :last_name %>
    </p>
<%end%>
    <%= f.submit "Submit" %>
<%end%>

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Я понял это.Оказывается, что некоторые вещи были неправильными и нуждались в изменении в дополнение к двум предложениям @Delba.

Форма:

Я посмотрел на RailsCasts # 196 снова и заметил, что моя форма выглядела иначе, чем та, что использовалась там, поэтому я попытался сопоставить ее:

    <%= form_for @service_offering do |f|%>
     <p>
      <%= f.label :name%>             
      <%= f.text_field :name %>

      <%= f.label :description %>  
      <%= f.text_field :description %>
     </p>
    <%= f.fields_for :business_developers do |builder| %>
     <p>
      <%= builder.label :first_name %>
      <%= builder.text_field :first_name %>

      <%= builder.label :last_name %>
      <%= builder.text_field :last_name %>
     </p>
<%end%>
    <%= f.submit "Submit" %>
<%end%>

Первоначально это выдало ошибку:

undefined method `service_offerings_path'

Маршруты:

Это привело меня к изучению RESTful Routes , потому что я использовал старый стиль маршрутизации:

match ':controller(/:action(/:id(.:format)))'

Таким образом, я обновил мои маршруты до нового стиля RESTful Routes:

  get "service_offerings/list"
  resource :service_offerings
  resource :business_developers

attr_accessible :

Это позволило увидеть форму, но она все еще не работала.Поэтому я немного поискал на этом сайте и обнаружил этот пост , в котором говорилось о добавлении "thing_attributes "к вашей модели родительских объектов в attr_accessible.Итак, я сделал:

class ServiceOffering < ActiveRecord::Base 
 has_many :business_developer_service_offerings
 has_many :business_developers, :through => :business_developer_service_offerings
 accepts_nested_attributes_for :business_developers
 attr_accessible :name, :description, :business_developers_attributes  
end

Это изменение вместе с предложением @ Delba, показанным в приведенной выше модели, и контроллер, указанный ниже, решили это.

def new
 @service_offering = ServiceOffering.new
 @business_developer = @service_offering.business_developers.build
end 
0 голосов
/ 22 ноября 2011

Вы просто забыли назначить @ business_developper.

def new
  @service_offering = ServiceOffering.new
  @business_developper = @service_offering.business_developpers.build
end

-

@business_developer = @service_offering.business_developers.build

инициализирует экземпляр biz_dev, который затем доступен в представлении. fields_for: biz_dev на самом деле не привязан к этому экземпляру, но к отношениям «многие ко многим» между сервом и серверами biz_dev

Таким образом, вы можете добавить несколько входов для дополнительного biz_dev, если вы инициализируете другой экземпляр biz_dev в вашем контроллере. Например:

5.times { @service_offering.biz_dev.build }

добавит дополнительные поля в вашу форму без необходимости объявлять их в вашем представлении.

Надеюсь, это помогло.

...