Рельсы 3: массовое назначение с ActiveAdmin и has_one

#ruby-on-rails #has-one #mass-assignment #activeadmin

#ruby-on-rails #имеет один #массовое присвоение #activeadmin

Вопрос:

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

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

Кто-нибудь имеет представление об этом?

Комментарии:

1. Вы перезапустили свой сервер после добавления attr_accessible?

2. ДА. Проблема массового присвоения была решена с помощью ответа Томаса Уотсона. Однако я все еще не могу создать User and Client .

Ответ №1:

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

 class User < ActiveRecord::Base
  attr_accessible :client_attributes
end
  

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

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

Комментарии:

1. Я сделал то, что вы мне сказали, и это подавляет предупреждение о массовом назначении. Однако он еще не проверяет клиента, перенаправляя меня обратно на create user с ошибками проверки.

2. Обновление: я уже могу редактировать выходящего пользователя. Но я все еще не могу создать новый.

3. Если отображаются не все ошибки проверки, вы можете добавить <%= @user.errors.messages.inspect %> в начало страницы, на которую вы перенаправлены обратно. При этом отобразится массив ошибок, содержащий все ваши ошибки

4. Извините, что я так долго отвечал. Я действительно решил проблему. Решение заключается в том, что вы сказали, но у меня был обратный вызов ‘after_initialize’ для создания вложенного клиентского ресурса, который очистил атрибуты, отправленные браузером, до того, как произошло действие сохранения. 1 для вашего решения!

5. Разве это не делает user.client уязвимым для атак с использованием формы?