Две модели, Организация и Пользователь, имеют отношения 1: много. У меня есть комбинированная форма регистрации, в которой зарегистрирована организация и пользователь для этой организации.Как отображать сообщения об ошибках в многомодельной форме с транзакцией?
Проблема, с которой я столкнулся, заключается в следующем: при отправке неверной информации для пользователя она снова отображает форму, как и должно, но сообщения об ошибках (например, «имя пользователя не может быть пустым») для пользователя: не отображается. Форма работает, когда действительная информация отправляется, и она отображает сообщения об ошибках для организации, а не для пользователя.
Как мне настроить код ниже, чтобы также отображались сообщения об ошибках для пользователя?
def new
@organization = Organization.new
@user = @organization.users.build
end
def create
@organization = Organization.new(new_params.except(:users_attributes)) #Validations require the organization to be saved before user, since user requires an organization_id. That's why users_attributs are above excluded and why below it's managed in a transaction that rollbacks if either organization or user is invalid. This works as desired.
@organization.transaction do
if @organization.valid?
@organization.save
begin
# I executed next line in debugger (with invalid user info), which correctly responds with: ActiveRecord::RecordInvalid Exception: Validation failed: Email can't be blank, Email is invalid, Username can't be blank, etc.
@organization.users.create!(users_attributes)
rescue
# Should I perhaps add some line here that adds the users errors to the memory?
raise ActiveRecord::Rollback
end
end
end
if @organization.persisted?
flash[:success] = "Yeah!"
redirect_to root_url
else
@user = @organization.users.build(users_attributes) # Otherwise the filled in information for user is gone (fields for user are then empty)
render :new
end
end
Вид формы включает в себя:
<%= form_for @organization, url: next_url do |f| %>
<%= render partial: 'shared/error_messages', locals: { object: f.object, nested_models: f.object.users } %>
<%= f.text_field :name %>
# Other fields
<%= f.fields_for :users do |p| %>
<%= p.email_field :email %>
# Other fields
<% end %>
<%= f.submit "Submit" %>
<% end %>
Сообщения об ошибках парциальное выглядит следующим образом:
<% object.errors.full_messages.each do |msg| %>
<li><%= msg.html_safe %></li>
<% end %>
Обновление: После шагов от ответа Роба я прибыл на ошибки частично ниже. Это все еще не отображает сообщения об ошибках для пользователя. Я добавил ответы отладчика внутри кода ниже, и по какой-то причине nested_model.errors.any?
возвращает false, а отладчик внутри контроллера (см. Выше) возвращает сообщения об ошибках для пользователя.
<% if object.errors.any? %>
<div id="error_explanation">
<div class="alert alert-danger">
The form contains <%= pluralize(object.errors.count, "error") %>.
</div>
<ul>
<% object.errors.full_messages.each do |msg| %>
<li><%= msg.html_safe %></li>
<% end %>
</ul>
</div>
<% end %>
<% if defined?(nested_models) && nested_models.any? %>
# Debugger: responds with "local-variable" for "defined?(nested_models)" and for "nested_models.any?" returns true.
<div id="error_explanation">
<ul>
<% nested_models.each do |nested_model| %>
# Debugger: "nested_model" has the same values as "nested_models.any?", as you would expect. But for "nested_model.errors.any?" it returns false, which it shouldn't.
<% if nested_model.errors.any? %> #Initially had "unless nested_model.valid?" but then errors for User are immediately displayed on loading the form page (new method).
<ul>
<% nested_model.errors.full_messages.each do |msg| %>
<li><%= msg.html_safe %></li>
<% end %>
</ul>
<% end %>
<% end %>
</ul>
</div>
<% end %>
Все те же, я боюсь, нет сообщений об ошибках для недопустимой информации о пользователе. Однако есть одна разница: форма регистрации существует на 'url/signup/organization'. Когда он отображается с 'new' при недействительной информации, url изменяется на' url/organization'. Это всегда было так. При отправке визуализированной формы он обрабатывает ее. При добавлении проверки повторная отправка генерирует ошибку программы: «Нет маршрутов, совпадающих с [PATCH]»/организациями »(только если какая-либо информация включена для пользователя). – Nick
Такое поведение исчезло. Я опубликовал свой новый, очищенный код в OP. Я добавил в файл модели 'validates_associated: users'. Единственная оставшаяся проблема заключается в том, что сообщения об ошибках для пользователя не отображаются. – Nick