Почему Rails не может добавить новую запись в базу данных?

#ruby-on-rails #ruby #postgresql

#ruby-on-rails #ruby #postgresql

Вопрос:

Я использую PostgreSQL. У меня есть следующая форма по /main URL (localhost:3000 / main):

 =form_for(@car) do |b|
    .col-xs-2= b.text_field(:type, class: "form-control", placeholder: "Type")
    = b.submit('Buy', class: "btn btn-default")
 

В моем контроллере:

 def main
  @car = Car.new
end

def new
  @car = Car.new
end

def create
@car = Car.new(car_params)

respond_to do |format|
  if @car.save
    format.html { redirect_to @car, notice: 'Car was successfully ordered.' }
    format.json { render :show, status: :created, location: @car }
  else
    format.html { render :new }
    format.json { render json: @car, status: :unprocessable_entity }
  end
end
 

завершение

где

 def car_params
  params.require(:car).permit(:type)
end
 

Я проверил свой код 100 раз, и, кажется, все в порядке, но я не могу добавить новую запись в свою таблицу базы данных. Кто-нибудь может мне помочь, почему это происходит? В чем проблема в моем коде?

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

1. И вот мы снова. Не меняйте свой вопрос 20 раз. Вы аннулируете ответы. Опубликуйте свой фактический код с самого начала, в первой редакции.

2. @SergioTulentsev вы правы! Извините за это! Вот как теперь выглядит мой код!

3. Можете ли вы проверить, есть ли какие-либо проверки, применяемые в модели? Вы можете распечатать @car.errors в блоке else, чтобы проверить это

4. покажите свою модель

5. @Doe: ну, вам нужно изучить несколько простых приемов отладки. Попадает ли элемент управления в действие создания? Каковы параметры? Каков результат @car.save ? Это это false , что такое @car.errors ? и так далее, и тому подобное.

Ответ №1:

Вы забыли сохранить машину. Несмотря на то, что вы объявили и установили объект, вы забыли сохранить его в базе данных.

Вы должны сделать это, добавив следующую строку:

 @car.save
 

в действии создания

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

1. ах, нет, извините. Это моя ошибка при заполнении кода внутри вопроса. Итак, у меня есть метод сохранения в моем коде. Я обновил свой вопрос

Ответ №2:

В вашем методе create отсутствует несколько вещей. Необходимо добавить «.new», где устанавливается переменная car, а затем также «.save», где находится оператор if, я считаю, что это должно сделать.

Метод создания должен быть таким, как показано ниже

 def create
   @car = Car.new(car_params)

respond_to do |format|
  if @car.save
    format.html { redirect_to @car, notice: 'Car was successfully ordered.' }
    format.json { render :show, status: :created, location: @car }
else
    format.html { render :new }
    format.json { render json: @car, status: :unprocessable_entity }
  end
end
 

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

1. ах, нет, извините. Это моя ошибка при заполнении кода внутри вопроса. Итак, у меня есть «новый» метод в моем коде. Я обновил свой вопрос

Ответ №3:

@car = Car(car_params) неверно. Вам нужно сделать @car = Car.new(car_params)

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

1. ах, нет, извините. Это моя ошибка при заполнении кода внутри вопроса. Итак, у меня есть «новый» метод в моем коде. Я обновил свой вопрос. Извините за это!

Ответ №4:

Первое, что вам нужно сделать, это заменить эту строку в вашем методе create .

 @car = Car(car_params)
 

с помощью этой строки

 @car = Car.new(car_params)
 

Потому что нам нужно инициализировать запись car с разрешенными параметрами. После этого вам нужно вызвать @car.save , который вернет логическое значение.

Таким образом, вы можете проверить это, если условие, например

 if @car.save
 

Надеюсь, это решит вашу проблему.

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

1. ах, нет, извините. Это моя ошибка при заполнении кода внутри вопроса. Итак, у меня есть «новый» метод в моем коде. Я обновил свой вопрос. Извините за это!

2. Можете ли вы проверить, есть ли какие-либо проверки, применяемые в модели?

3. Вы можете распечатать @car.errors в блоке else, чтобы проверить это.