从不同的控制器调用创建操作
Call create action from different controller
我想从 bookings#new
和 rooms#show
创建一个预订。当我尝试从 bookings#new
创建它时它有效,但是当我尝试从 rooms#show
创建它时它显示错误:
1 error prohibited this booking from being saved, room must exist.
这是我使用的代码:
预订控制器:
def create
if @room
@room = Room.find(params[:room_id])
@booking = @room.bookings.create(booking_params)
if @booking.save
redirect_to room_path(@room)
else
render :new
end
else
@booking = Booking.new(booking_params)
respond_to do |format|
if @booking.save
format.html { redirect_to @booking, notice: 'Booking was successfully created.' }
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
end
views/rooms/show.html.erb
<h2>book this room:</h2>
<%= form_with(model: [ @room, @room.bookings.build ], local: true) do |form| %>
<p>
<%= form.label :traveller %>
<%= form.text_field :traveller %>
</p>
<p>
<%= form.label :startfrom %>
<%= form.datetime_select :startfrom %>
</p>
<p>
<%= form.label :endsat %>
<%= form.datetime_select :endsat %>
</p>
<p>
<%= form.label :bookingref %>
<%= form.text_field :bookingref %>
</p>
<p>
<%= form.submit %>
</p>
<% end %>
你的错误在控制器的 if-else 中。您在定义 @room
之前检查它,因此它始终为零。应该是:
def create
# use find_by here, otherwise you get RecordNotFound error
@room = Room.find_by(id: params[:room_id])
if @room
# use build, because create saves the instance
@booking = @room.bookings.build(booking_params)
if @booking.save
redirect_to room_path(@room)
else
# I suppose you don't want render bookings/new view here
render 'books/show'
end
else
@booking = Booking.new(booking_params)
respond_to do |format|
# redirect and render logic goes here. BTW, do you really need json response format?
end
end
end
end
此外,在房间中定义#show action
@booking = @room.bookings.build
并使用表单中的实例正确显示验证错误
form_with(model: [@room, @booking], local: true) do |form|
我想从 bookings#new
和 rooms#show
创建一个预订。当我尝试从 bookings#new
创建它时它有效,但是当我尝试从 rooms#show
创建它时它显示错误:
1 error prohibited this booking from being saved, room must exist.
这是我使用的代码:
预订控制器:
def create
if @room
@room = Room.find(params[:room_id])
@booking = @room.bookings.create(booking_params)
if @booking.save
redirect_to room_path(@room)
else
render :new
end
else
@booking = Booking.new(booking_params)
respond_to do |format|
if @booking.save
format.html { redirect_to @booking, notice: 'Booking was successfully created.' }
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
end
views/rooms/show.html.erb
<h2>book this room:</h2>
<%= form_with(model: [ @room, @room.bookings.build ], local: true) do |form| %>
<p>
<%= form.label :traveller %>
<%= form.text_field :traveller %>
</p>
<p>
<%= form.label :startfrom %>
<%= form.datetime_select :startfrom %>
</p>
<p>
<%= form.label :endsat %>
<%= form.datetime_select :endsat %>
</p>
<p>
<%= form.label :bookingref %>
<%= form.text_field :bookingref %>
</p>
<p>
<%= form.submit %>
</p>
<% end %>
你的错误在控制器的 if-else 中。您在定义 @room
之前检查它,因此它始终为零。应该是:
def create
# use find_by here, otherwise you get RecordNotFound error
@room = Room.find_by(id: params[:room_id])
if @room
# use build, because create saves the instance
@booking = @room.bookings.build(booking_params)
if @booking.save
redirect_to room_path(@room)
else
# I suppose you don't want render bookings/new view here
render 'books/show'
end
else
@booking = Booking.new(booking_params)
respond_to do |format|
# redirect and render logic goes here. BTW, do you really need json response format?
end
end
end
end
此外,在房间中定义#show action
@booking = @room.bookings.build
并使用表单中的实例正确显示验证错误
form_with(model: [@room, @booking], local: true) do |form|