Ruby on Rails — потеря значений формы после неудачной проверки некоторых полей

#ruby-on-rails #validation

#ruby-on-rails #проверка

Вопрос:

У меня есть форма

      <%= f.input :firstname, :label => "Forename", :input_html => { :placeholder => "Forename"} %>
     <%= f.input :surname, :label => "Surname", :input_html => { :placeholder => "Surname", :"data-

  <%= f.input :publiclyfundedteaching, :label => "Publicly funded teaching (PFT)", :input_html => {:style => 'width:7%', :id => "publiclyfundedteaching", :value => '0', :onkeyup => "myFunction()"} %>

  <%= f.input :non_publicly_funded_teaching, :label => "Non-Publicly Funded teaching (NPFT)", :input_html => {:style => 'width:7%', :id => "non_publicly_funded_teaching", :value => '0', :onkeyup => "myFunction()"} %>
  

и контроллер

 def create


@submission = Submission.new(submission_params)
@email = @submission.email
puts @email
if @submission.save
  flash[:notice] = 'Your user was successfully created.'
  
  else

@staffform = Form.find(10000)
   @livestatus = @staffform.status
   puts @staffform.status
   puts "not saved"

  puts @submission.errors.full_messages
render :new
  end
  

И модель:

 validates :firstname, presence: true
validates :surname, presence: true
validates :email, presence: true


validates :total, numericality: { only_integer: true, equal_to: 100}


# First group

validates :publiclyfundedteaching, numericality: { only_integer: true }
validates :non_publicly_funded_teaching, numericality: { only_integer: true }
validates :support_for_teaching, numericality: { only_integer: true }
  

Проблема заключается в следующем: publiclyfundedteaching, non_publicly_funded_teaching и support_for_teaching для полей обучения не сохраняют там значения после проверки. Адрес электронной почты, фамилия и имя соответствуют.

Пожалуйста, посоветуйте, как я могу обойти это. Я предполагаю, что это как-то связано с атрибутом value в этих полях?

Очень признателен!!

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

1. Не могли бы вы рассказать нам, как выглядит submission_params перед созданием новой записи? Опция only_integer: true проверяет поле на соответствие регулярному выражению /A [ -]?d z/ Обратите внимание, что «2» будет соответствовать, а «2.0» — нет.

2. Спасибо за ответ см. Комментарий ниже

Ответ №1:

Посмотрите, как у вас есть :value => '0' поля формы для обоих :publiclyfundedteaching и :non_publicly_funded_teaching (третье, которое вы упомянули, отсутствует в вашей форме). Они установят значение в полях равным 0, даже если вы перезагрузите ранее заполненную форму. Вы можете либо удалить это, либо попытаться добавить статус if следующим образом (при условии, что представление является моделью):

 <%= f.input :publiclyfundedteaching, label: "Publicly funded teaching (PFT)", input_html: { style: 'width:7%', id: "publiclyfundedteaching", value: @submission.publiclyfundedteaching || 0, onkeyup: "myFunction()" } %>

  

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

1. Большое спасибо, Клара. Очень признателен. Именно то, что мне нужно

2. Добро пожаловать, я был бы рад, если вы сможете принять мой ответ!

Ответ №2:

У submission_params вас, вероятно, есть что-то вроде:

 def submission_params
  params.require(:your_model_name).permit(:firstname, :surname, :email)
end
  

это удаляет все другие поля, чтобы защитить их от подделки данных клиентом

если вы хотите, чтобы поле было доступно для записи — добавьте его в разрешенное

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

1. Большое спасибо! Вероятно, я неправильно объяснил проблему. по сути, когда проверка запускается с отображением сообщений об ошибках формы, значения полей для :firstname, : фамилия, :email все еще присутствуют, но мы потеряли другие значения, которые пользователь ввел для числовых полей. возможно из-за атрибута value, изначально связанного с этими полями.