После сохранения foreign_key = nil - Устранение ошибки в дБ - PullRequest
0 голосов
/ 25 марта 2019

Я сохраняю @booking с пользователем (называется "букер").Сразу после @ booking.save я могу получить @ booking.booker в командной строке, которая отображает все свойства пользователя (адрес электронной почты, пароль, идентификатор и т. Д.).Однако после выхода из метода создания его невозможно получить (например, из шоу): @ booking.booker = nil.Я предполагаю, что это происходит из-за ошибки в моей модели бронирования: у меня есть own_to и has_many_through.Если ошибка возникла отсюда, как ее решить, не меняя все БД?

booking_controller.rb

class BookingsController < ApplicationController
  before_action :set_booking, only: [:show, :edit, :update ]
  before_action :set_booking_format, only: [:destroy ]
  def index
  end

  def my_bookings
    @bookings = BookingPolicy::Scope.new(current_user, Booking).scope.where(booker: current_user)
  end

  def show
    authorize @booking
  end

  def new
    @garden = Garden.find(params[:garden_id])
    @booking = Booking.new
    authorize @booking
  end

  def create
    @garden = Garden.find params[:garden_id]
    @booking = @garden.bookings.build(booker: current_user)

    authorize @booking
    if @booking.save
      redirect_to garden_booking_path(@booking, current_user)
    end
  end

  def update
  end

  private

  def set_booking
    @booking = Booking.find(params[:id])
  end

  def set_booking_format
    @booking = Booking.find(params[:format])
  end
  def booking_params
    params.require(:booking).permit(:garden_id, :booker_id, :date)
  end
end

booking.rb

class Booking < ApplicationRecord
  belongs_to :garden
  belongs_to :booker, class_name: "User"
end

garden.rb

class Garden < ApplicationRecord
  belongs_to :user
  has_many :bookings, dependent: :destroy
end

user.rb

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :gardens
  has_and_belongs_to_many :bookings
end

schema.rb

create_table "bookings", force: :cascade do |t|
    t.date "date"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "garden_id"
    t.integer "booker_id"
    t.index ["garden_id"], name: "index_bookings_on_garden_id"
 end

  create_table "gardens", force: :cascade do |t|
    t.string "title"
    t.text "details"
    t.integer "surface"
    t.text "address"
    t.bigint "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.text "availabilities"
  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", null: false
    t.datetime "updated_at", null: false
    t.boolean "admin", default: false
    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

  add_foreign_key "bookings", "gardens"
end

1 Ответ

0 голосов
/ 25 марта 2019

В вашей модели user.rb:

class User < ApplicationRecord

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_many :gardens
  has_and_belongs_to_many :bookings
end

Ассоциация :bookings должна быть has_many. Вы не используете объединяющую таблицу.

См .: https://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

Часть belongs_to ассоциации habtm ищет внешний ключ, который не существует.Вы можете получить @booking.booker перед переходом к другому действию контроллера, потому что вы вообще не обращаетесь к базе данных, вы просто получаете связь переменных экземпляра.

...