#ruby-on-rails #validation #activerecord
#ruby-on-rails #проверка #activerecord
Вопрос:
Когда форма данных отправляется на создание, могут ли проверки просто отсеять неверные данные и не создавать эти экземпляры, но позволить другим «хорошим данным» продолжаться?
Итак, для более понятного сценария, скажем, я отправляю форму, которая создает новую книгу, но в этой форме есть 10 полей для создания 10 разных книг одновременно. У меня есть проверка в книге, в которой говорится, что присутствие верно. Когда пользователь заполняет форму, допустим, у него заполнено только 8 из 10 слотов для книг. Поскольку последние 2 пустых книжных слота пусты, проверка будет работать, чтобы остановить это создание, но я все равно хочу, чтобы остальные данные были созданы.
Я новичок в программировании, поэтому мне было очень сложно найти правильные слова, чтобы я мог найти четкий ответ через Google. Спасибо за помощь!
РЕДАКТИРОВАТЬ: мой фактический проект использует модель Card:
class Card < ApplicationRecord
belongs_to :group
validates :front,:back, presence: true
end
Форма:
<h3>Cards</h3>
<%= f.fields_for :cards do |c| %>
<%= c.label :front %>
<%= c.text_field :front %>
<%= c.label :back %>
<%= c.text_field :back %>
<br />
<% end %>
Это вложенная форма, так что это параметры new, create и strong в моем групповом контроллере:
def new
if params[:user_id] amp;amp; @user = User.find_by_id(params[:user_id])
@group = @user.groups.build
@group.build_category
5.times {@group.cards.build}
else
@group = Group.new
end
end
def create
@group = current_user.groups.build(group_params)
if @group.save
redirect_to user_groups_path(current_user)
else
redirect_to new_user_group_path(current_user)
end
end
private
def group_params
params.require(:group).permit(:title, :description, :category_id, category_attributes: [:name],
cards_attributes: [:front, :back])
end
Ошибка: ошибка не выводится, он просто перерисовывает страницу новой формы и выделяет ‘field_with_error’ красным цветом. Например, он ожидает, что все поля будут заполнены.
Комментарии:
1. Интересно, я получаю другой результат. Когда пользователь не заполняет все поля книги, он повторно отображает форму и не проходит. Я собираюсь включить свои проверки и форму в вопрос.
2. Хорошо, у вас есть несколько вхождений этой формы карточки в представлении или только одно? Если это только один, то это ожидаемый результат, если их больше, вам нужно будет выполнить проверку этого, чтобы учесть это. Также можете ли вы включить (в вопрос) точный вывод ошибки, который вы получаете? Я чувствую, что это даст наибольшее представление о том, что происходит.
3. Да, это несколько текстовых полей! Хорошо, я собираюсь добавить больше информации к сообщению.
4. Ах, это имеет большой смысл! Хорошо, да, я думаю, что попытка удалить проверки и создать метод before_save должна быть хорошим следующим шагом. Как вы думаете, возможно ли также создать пользовательский метод установки card_attributes=(attributes)? Например, может быть, внутри метода setter я могу сказать, чтобы он просматривал каждый из них, если пустой, то пропускал? («пропустить» — это то, что может произойти в ruby?»), А затем сохранить те, у которых есть present? Результат. И да, смысл проверки в том, что я не хочу, чтобы в группах были какие-либо карточки, которые просто пустые.
5. Я думаю, что приведенный ниже ответ — это то, что вы, вероятно, ищете. Счастливого кодирования!
Ответ №1:
Проверка в порядке и необходима, чтобы избежать сохранения записей с отсутствующими полями, поэтому сохраните ее.
Самый чистый способ достичь того, что вы ищете, — это установить accepts_nested_attributes_for :cards, reject_if: :all_blank
на вашей Group
модели. Записи, :all_blank
у которых все атрибуты пустые, будут отклонены. Также вы можете установить свои собственные критерии для отклонения записей следующим образом:
class Group < ApplicationRecord
has_many :cards
accepts_nested_attributes_for :cards, reject_if: :card_is_empty?
private
def card_is_empty?(c)
c.front.blank? amp;amp; c.back.blank?
end
end
Другой способ — поместить a before_validation :remove_empty_cards
в вашу Group
модель и в remove_empty_cards
методе удалить все карточки, у которых есть пустые передняя и задняя части.
Комментарии:
1. Большое вам спасибо, это очень полезно!