如何在 Ruby on Rails 中的活动记录关联控制器中添加另一个模型的 ID



我必须制作一个酒店预订系统,所以我制作了一个用户,酒店和预订模型,并给出了所有必要的关联。 在预订模型中,我给了用户和酒店:参考资料 因此,在booking_controller的创建方法中创建新预订时,我给出了 @booking.user = current_user 由 Devise Gem 提供。 如何在控制器中提供hotel_id。

这是 Schema.rb

create_table "bookings", force: :cascade do |t|
t.integer "user_id", null: false
t.string "guest_name"
t.integer "no_of_guest"
t.integer "room"
t.date "check_in_date"
t.date "check_out_date"
t.integer "hotels_id", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["hotels_id"], name: "index_bookings_on_hotels_id"
t.index ["user_id"], name: "index_bookings_on_user_id"
end

这是创建预订表格的链接

<%= link_to 'Book Now', new_booking_path(:id => @hotel.id), :class => 'btn btn-success btn-sm' %>

booking_controller.rb

def create
@booking = Booking.new(booking_params)
@booking.user = current_user

respond_to do |format|
if @booking.save
format.html { redirect_to @booking, notice: 'Booking successfully !!!' }
format.json { render :show, status: :created, location: @booking }
else
format.html { render :new }
format.json { render json: @booking.errors, status: :unprocessable_entity }
end
end
end

我应该如何以及在哪里为预订设置特定的酒店 ID?

Rails 的方法是创建一个嵌套路由:

resources :hotels do
resources :bookings, shallow: true
end

这将创建路由GET /hotels/:hotel_id/bookings/newPOST /hotels/:hotel_id/bookings以及命名的帮助程序new_hotel_booking_path

<%= link_to 'Book Now', new_hotel_booking_path(@hotel), class: 'btn btn-success btn-sm' %>

调整控制器,以便在回调中创建设置酒店,并在酒店外构建预订:

class BookingsController < ApplicationController
before_action :set_hotel, only: [:new, :index, :create]
# GET /hotels/1/bookings/new
def new
@booking = @hotel.bookings.new
end
# POST /hotels/1/bookings
def create
@booking = @hotel.bookings.new(booking_params) do |b|
b.user = current_user
end
respond_to do |format|
if @booking.save
format.html { redirect_to @booking, notice: 'Booking successful' }
format.json { status: :created, location: @booking } # send either a Location header or a response entity - not both
else
format.html { render :new }
format.json { render json: @booking.errors, status: :unprocessable_entity }
end
end
end
private
def set_hotel
@hotel = Hotel.find(params[:hotel_id])
end 
# ...
end

传递数组以使用表单创建嵌套资源:

# Rails < 5.1
<%= form_for([@hotel, @booking]) do |f| %>
# Rails 5.1+
<%= form_with(model: [@hotel, @booking]) do |f| %>

我相信你有如下booking模型:

class Booking
belongs_to :user
belongs_to :hotel
......
end

我假设您在页面中有一个hotel列表或hotel对象,并且在该列表前面Book Now链接。在代码中,您id作为参数传递,但您应该传递hotel_id而不是id

<%= link_to 'Book Now', new_booking_path(hotel_id: @hotel.id), :class => 'btn btn-success btn-sm' %>

那么在booking_controller.rb中,您必须拥有booking_params方法以及createnew方法。

def new
@booking = Booking.new
@booking.hotel = Hotel.find(params[:hotel_id])
end
def create
@booking = Booking.new(booking_params.merge!(user: current_user))
respond_to do |format|
if @booking.save
format.html { redirect_to @booking, notice: 'Booking successfully !!!' }
format.json { render :show, status: :created, location: @booking }
else
format.html { render :new }
format.json { render json: @booking.errors, status: :unprocessable_entity }
end
end
end
private
def booking_params
params.require(:booking).permit(:user_id, :hotel_id, add_other_fields_you_want_to_save)
end

相关内容

  • 没有找到相关文章