Does accepts_nested_attributes_ для работы с belongs_to? - программирование
Подтвердить что ты не робот

Does accepts_nested_attributes_ для работы с belongs_to?

Я получаю всевозможные противоречивые сведения об этом основном вопросе, и ответ довольно важен для моих текущих проблем. Итак, очень просто, в 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"
4b9b3361

Ответ 1

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

Ответ 2

Названия состояний epocwolf doc в первой строке "Вложенные атрибуты позволяют сохранять атрибуты связанных записей через родительский." (мой акцент).

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

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

Ответ 3

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

(1) Добавить новую attr_accessible в вашу дочернюю модель (модель пользователя).

accepts_nested_attributes_for :organization
attr_accessible :organization_attributes

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

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

Ответ 4

Для 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