#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
andClient
.
Ответ №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 уязвимым для атак с использованием формы?