Проблема с формой создания (Simpleform) PG ​​:: NotNullViolation: ОШИБКА: нулевое значение в столбце с Rails - PullRequest
0 голосов
/ 29 января 2020

Здравствуйте, у меня есть проблема с моим приложением Rails, когда я пытаюсь создать «Enfant», который принадлежит пользователю и Nounou, но моя проблема в том, что когда я создаю «enfant», я пользователь с идентификатором, но, Я еще не выбрал nounou, поэтому у меня нет nounou_id, это мой дифференцированный код (я пытаюсь указать необязательный: true, но он не работает: модели и схемы

class Enfant < ApplicationRecord
  belongs_to :user
  belongs_to :nounou, optional: true
end


class Nounou < ApplicationRecord
  has_many :enfants
end


class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :enfants
end


  create_table "enfants", force: :cascade do |t|
    t.string "last_name"
    t.string "first_name"
    t.bigint "nounou_id", null: false
    t.bigint "user_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["nounou_id"], name: "index_enfants_on_nounou_id"
    t.index ["user_id"], name: "index_enfants_on_user_id"
  end

  create_table "nounous", force: :cascade do |t|
    t.string "name"
    t.integer "price"
    t.string "localisation"
    t.integer "evaluation"
    t.integer "places"
    t.string "first_name"
    t.string "last_name"
    t.string "photo"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.string "username"
    t.string "photo"
    t.string "first_name"
    t.string "last_name"
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end

end


Ответы [ 2 ]

0 голосов
/ 31 января 2020

Большое спасибо, это было в моем файле миграции: t.bigint "nounou_id" t.bigint "user_id", null: false Я удаляю null: false для nounou_id, и это работает;)

0 голосов
/ 30 января 2020

Есть две проблемы с опцией null: false:

  • Не считается, что ассоциация belongs_to может быть необязательной.
  • Если уже есть записи в база данных, выполняющая миграцию, сгенерирует исключение, так как нет значения по умолчанию (в PostgreSQL, PG::NotNullViolation: ERROR: column "user_id" contains null values).

Вот ссылка.

Решение:

  • Ваша форма, вероятно, отправляет nounou_id как nil или что-то в этом роде. Вам необходимо проверить это, проверив, что ваш params достигает вашего create метода.

  • Вы сделали nounou_id необязательным только в модели, но вам нужно запустить миграцию, чтобы сделать это необязательно в db, где четко сказано, что это не может быть ложью (null: false). Вы можете получить помощь для этой миграции с здесь .

  • Вы должны изменить свой метод enfant_params в рельсах:

def enfant_params
  params.require(:enfant).permit(:last_name, :first_name, :user_id, :nounou_id)
end

Я уверен, что это решит вашу проблему, но если вам все еще нужна помощь, обновите ваш вопрос с помощью кода формы, create action и enfant_params и обновленного schema.

Удачи.

...