Rails вызывает пользовательскую проверку перед .new или .create

Я создаю объекты в цикле контроллера.

Мне нужно проверить массив pet_name до начала цикла. (потому что я получил undefined method 'each' for nil:NilClass когда params[:pet_name].each do |pid|) бежит)

Но моя проверка всегда вызывалась после User.new или User.create. Я хочу изменить валидацию, когда я нажимаю кнопку отправки и проверяю валидацию, и перенаправляю обратно, когда массив pet_name равен нулю. Как я могу изменить свой код?

Контроллер

  def create
    user_name = params[:user_name]
    
    params[:pet_name].each do |pid|
      @user = User.new
      @user.name = user_name
      @user.pet_name = pid
      render :new unless @user.save
    end
    redirect_to users_path
  end

Пользователь.rb

class User < ApplicationRecord
  has_many :pet

  validates :name, presence: true
  validates :pet_name, presence: true
  validate :check_pet
  def check_pet
    if pet_name.nil?
      errors.add(:pet_name, 'at least one pet id')
    end
  end
end

Структура коляски

  { name: 'blabla', pet_name: ['blabla', 'blablabla', 'bla'] }

потому что у вас есть одна проверка по умолчанию и одна пользовательская проверка в вашей модели. Удалите это 'validates :pet_name, присутствие: true', если вам нужна только пользовательская проверка.

LHH 21.11.2022 07:37

@lhh спасибо. но это все еще не работает из-за нулевой ошибки цикла

nicecoding521235 21.11.2022 08:57

@lhh могу ли я проверить перед созданием цикла?

nicecoding521235 21.11.2022 08:58

чего вы пытаетесь достичь здесь? есть ли какое-то конкретное значение, которое вы проверяете в массиве перед сохранением?

LHH 21.11.2022 10:43

@lhh Я пытаюсь проверить, равны ли params[:pet_name] (массив) нулю перед созданием, но я только что изменил, чтобы проверить параметры перед созданием. Спасибо за вашу помощь

nicecoding521235 21.11.2022 10:57

Отвечает ли это на ваш вопрос? Проверка Rails с контроллера

New Alexandria 22.11.2022 13:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Извините, но это даже близко не похоже на то, как вы подходите к проблеме в Rails.

Если вы хотите, чтобы у пользователя было много питомцев и он принимал ввод данных для питомцев при создании пользователей, вам необходимо создать рабочую ассоциацию с моделью питомца и позволить пользователю принимать вложенные атрибуты:

class User < ApplicationRecord
  has_many :pets # has_many assocations should always be plural!
  validates :name, presence: true
  validates :pets, presence: true
  accepts_nested_attributes_for :pets
end
# rails g model pet name user:reference
class Pet < ApplicationRecord
  belongs_to :user
  validates :name, presence: true
end
class UsersController < ApplicationController
  def new
    @user = User.new(user_params)
    3.times { @user.pets.new } # seeds the form with blank inputs
  end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to @user, 
        success: 'User created',
        status: :created
    else
      render :new, 
        status: :unprocessable_entity
    end
  end

  private

  def user_params
    params.require(:user)
          .permit(:name, pets_attributes: [:name])
  end
end
<%= form_with(model: @user) do |form| %>
  <div class = "field">
    <%= form.label :name %>
    <%= form.text_input :name %>
  </div>

  <fieldset>
     <legend>Pets</legend>
     <%= form.fields_for(:pets) do |pet_fields| %>
     <div class = "nested-fieldset">
       <div class = "field">
         <%= pet_fields.label :name %>
         <%= pet_fields.text_input :name %>
       </div>
     </div>
     <% end %>
  </fieldset>

  <div class = "actions">
     <%= f.submit %>
  </div>
<% end %>

Это довольно сложная тема, и вы должны хорошо разбираться в основах Rails CRUD, прежде чем пытаться это сделать. Вам также следует подумать, хотите ли вы вместо этого использовать отдельный контроллер для создания питомцев по одному в качестве вложенного ресурса после создания пользователя.

Другие вопросы по теме