Может ли проверка отсеять неверные данные, но при этом позволить остальной части формы продолжить создание?

#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. Большое вам спасибо, это очень полезно!