Я создаю объекты в цикле контроллера.
Мне нужно проверить массив 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'] }
@lhh спасибо. но это все еще не работает из-за нулевой ошибки цикла
@lhh могу ли я проверить перед созданием цикла?
чего вы пытаетесь достичь здесь? есть ли какое-то конкретное значение, которое вы проверяете в массиве перед сохранением?
@lhh Я пытаюсь проверить, равны ли params[:pet_name] (массив) нулю перед созданием, но я только что изменил, чтобы проверить параметры перед созданием. Спасибо за вашу помощь
Отвечает ли это на ваш вопрос? Проверка Rails с контроллера
Извините, но это даже близко не похоже на то, как вы подходите к проблеме в 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, прежде чем пытаться это сделать. Вам также следует подумать, хотите ли вы вместо этого использовать отдельный контроллер для создания питомцев по одному в качестве вложенного ресурса после создания пользователя.
потому что у вас есть одна проверка по умолчанию и одна пользовательская проверка в вашей модели. Удалите это 'validates :pet_name, присутствие: true', если вам нужна только пользовательская проверка.