Accept_nested_attributes_for работает с own_to? - PullRequest
57 голосов
/ 09 сентября 2011

Я получаю всевозможную противоречивую информацию по этому основному вопросу, и ответ довольно важен для моих текущих проблем. Итак, очень просто, в Rails 3, разрешено или не разрешено использовать accepts_nested_attributes_for с отношением own_to?

class User < ActiveRecord::Base
  belongs_to :organization
  accepts_nested_attributes_for :organization
end

class Organization < ActiveRecord::Base
  has_many :users
end

В представлении:

= form_for @user do |f|
  f.label :name, "Name"
  f.input :name

  = f.fields_for :organization do |o|
    o.label :city, "City"
    o.input :city

  f.submit "Submit"

Ответы [ 4 ]

22 голосов
/ 16 апреля 2014

Вложенные атрибуты, по-видимому, работают нормально для ассоциации own_to с Rails 4. Возможно, это было изменено в более ранней версии Rails, но я тестировал в 4.0.4 и определенно работает как ожидалось.

21 голосов
/ 28 февраля 2012

В первой строке цитируется doc epochwolf: «Вложенные атрибуты позволяют сохранять атрибуты в связанных записях через родительский элемент ».(мой акцент).

Возможно, вас заинтересует этот другой SO вопрос, который совпадает с этим .В нем описаны два возможных решения: 1) перемещение accepts_nested_attributes на другую сторону отношения (в данном случае, Организация), или 2) с использованием метода build для построения Организации в Пользователе перед отображениемформа.

Я также нашел суть, которая описывает потенциальное решение для использования accepts_nested_attributes с отношением own_to , если вы готовы иметь дело с небольшим дополнительным кодом.Здесь также используется метод build.

10 голосов
/ 19 апреля 2014

Для belongs_to ассоциации в Rails 3.2 вложенная модель требует следующих двух шагов:

(1) Добавьте новый attr_accessible к вашей детской модели (модель пользователя).

accepts_nested_attributes_for :organization
attr_accessible :organization_attributes

(2) Добавьте @user.build_organization к вашему дочернему контроллеру (пользовательскому контроллеру), чтобы создать столбец organization.

def new
  @user = User.new
  @user.build_organization
end
4 голосов
/ 22 августа 2018

Для Ruby on Rails 5.2.1

class User < ActiveRecord::Base
  belongs_to :organization
  accepts_nested_attributes_for :organization
end

class Organization < ActiveRecord::Base
  has_many :users
end

Только что дошел до вашего контроллера, предположим, что это "users_controller.rb":

Class UsersController < ApplicationController

    def new
        @user = User.new
        @user.build_organization
    end
end

И представление, как Ник сделал:

= form_for @user do |f|
  f.label :name, "Name"
  f.input :name

  = f.fields_for :organization do |o|
    o.label :city, "City"
    o.input :city

  f.submit "Submit"

В конце мы видим, что @ user3551164 уже решил, но сейчас (Ruby on Rails 5.2.1) нам не нужен attr_accessible :organization_attributes

...