Rails 3: массовое назначение с ActiveAdmin и has_one

Я разрабатываю приложение для рельсов, в котором у меня есть две модели User и Client. User поддерживается устройством и отвечает за аутентификацию, а has_one Client содержит данные клиента для данного пользователя. Это отношение присутствует всегда, поскольку я гарантирую, что модель Client создается всякий раз, когда я создаю User.

Для области администрирования я использую ActiveAdmin. Теперь, когда я пытаюсь создать User через интерфейс администрирования, я использую такую ​​форму:

form do |f|
  f.inputs :username, :email, :password
  f.inputs :name => "Client", :for => :client do |client|
    client.inputs :name, :address, ...
  end
end

Проблема в том, что либо User, либо Client сохраняются и страница перезагружается с ошибками проверки. Я проверил консоль rails, и каждый раз, когда я пытаюсь создать файл User, появляется сообщение WARNING: Can't mass-assign protected attributes: client_attributes.

Я искал эту проблему и обнаружил, что для того, чтобы разрешить массовое назначение, нужно было определить attr_accessible для каждого из полей, разрешенных для назначения. Итак, я поместил эту директиву в модель Client для каждого из полей, упомянутых выше, и сообщение продолжает появляться, препятствуя правильному сохранению моделей.

Кто-нибудь знает об этом?


person Tiago    schedule 28.09.2011    source источник
comment
Вы перезапустили свой сервер после добавления attr_accessible?   -  person Peter Brown    schedule 28.09.2011
comment
Да. Проблема массового назначения была решена с ответом Томаса Уотсона. Однако я все еще не могу создать User и Client.   -  person Tiago    schedule 29.09.2011


Ответы (1)


Проблема не в вашей модели Client, а в вашей модели User, потому что это основная модель, которую вы пытаетесь создать. Все, что вам нужно сделать, это добавить client_attributes в список атрибутов attr_accessible в вашей модели User, как говорится в сообщении об ошибке в файлах журнала, например:

class User < ActiveRecord::Base
  attr_accessible :client_attributes
end

Я полагаю, у вас уже есть список доступных атрибутов в классе User. Так что просто добавьте client_attributes в конец этого списка.

Изменения, которые вы внесли в свою модель Client (т. е. добавили список атрибутов в attr_accessible), не нужны для того, чтобы это работало. Если вы хотите, вы также можете отменить это.

person Thomas Watson    schedule 29.09.2011
comment
Я сделал то, что вы сказали мне сделать, и это подавляет предупреждение о массовом назначении. Однако он еще не проверяет клиента, перенаправляя меня обратно к create user с ошибками проверки. - person Tiago; 29.09.2011
comment
Обновление: я уже могу редактировать существующего пользователя. Но я все еще не могу создать новый. - person Tiago; 29.09.2011
comment
Если отображаются не все ошибки проверки, вы можете добавить ‹%= @user.errors.messages.inspect %› вверху страницы, на которую вы перенаправляетесь обратно. Это отобразит массив ошибок, содержащий все ваши ошибки. - person Thomas Watson; 10.10.2011
comment
Извините, что так долго не отвечал. Я действительно решил проблему. Решение заключается в том, что вы сказали, но у меня был обратный вызов after_initialize для создания вложенного ресурса клиента, который очищал атрибуты, отправленные браузером, до того, как произошло действие сохранения. +1 за ваше решение! - person Tiago; 03.11.2011
comment
Разве это не делает user.client уязвимым для атак с внедрением формы? - person Dalibor Filus; 19.03.2012