Поэтому я попытался построить форму, состоящую из полей двух моделей. К сожалению, проверка работает только для одного из них, несмотря на то, что они одинаковы.
- Если в первом поле есть белый знак, консоль показывает красный «откат», а представление показывает ошибку.
- Если во втором поле белый знак, все идет как обычно, рендерится следующая страница, ошибок не показывается, ПОКА значение не сохраняется.
Подводя итог: валидация работает на обоих, но выдает ошибки и откаты только в случае первого. Кроме того, я использую гем Wicked Form Wizard.
Мои модели:
кандидат.rb
class Candidate < ApplicationRecord
belongs_to :user
has_one :candidate_form
has_one :employee_form
accepts_nested_attributes_for :candidate_form
accepts_nested_attributes_for :employee_form
end
кандидат_форма.rb
class CandidateForm < ApplicationRecord
belongs_to :candidate
validates_format_of :name, without: /\W/, allow_blank: true
end
employee_form.rb (как видите, это то же самое, что и кандидат_форма.rb)
class EmployeeForm < ApplicationRecord
belongs_to :candidate
validates_format_of :pesel, without: /\W/, allow_blank: true
end
контроллер:
def show
@candidate = current_user.candidate
render_wizard
end
def update
@candidate = current_user.candidate
@candidate.attributes = candidate_params
render_wizard @candidate
end
private
def candidate_params
params.require(:candidate).permit(candidate_form_attributes: [:id, :name],
employee_form_attributes: [:id, :pesel])
end
моя структура формы
<%= form_for @candidate, url: wizard_path, method: "put" do |f| %>
<%= f.fields_for :candidate_form do |cand| %>
<%= cand.text_field :name %>
<% end %>
<%= f.fields_for :employee_form do |emp| %>
<%= emp.text_field :pesel %>
<% end %>
<%= f.submit "NEXT" %>
<% end %>
Последнее уточнение, что не работает:
- "Имя с пробелом" - такая строка в поле :name препятствует сохранению формы, выдает ошибку, обеспечивает откат
- "Песель через пробел" - такая строка в поле :pesel НЕ МЕШАЕТ сохранению формы (только это поле не сохраняется) и отката не происходит