我正在尝试使停车场预订应用程序和一般预订工作。当我输入user id
,spot id
并选择is_booked
时。现在我想让位置列表旁边的按钮以同样的方式工作,但我无法获得位置的id,像这样:
<% @spots.each do |spot| %>
<tr>
<td><%= spot.name %></td>
<td><%= link_to 'Show', spot %></td>
<td><%= link_to 'Edit', edit_spot_path(spot) %></td>
<td><%= link_to 'Booking', new_booking_path %></td>
</tr>
<% end %>
</tbody>
目前的路径是new_booking,但只是预览,最终将是create_booking。
我尝试了几种方法,但没有一个工作,我能够引用所有id,但不是一个id。这是一个从booking_controller到new_booking定义的示例,我给出了这些参数:
@booking = current_user.bookings.build(:spot_id => Spot.ids, :is_booked => true)
一种方法是将资源嵌套到/config/routes中。rb文件。
所以关系是这样的:
resources :spots do
resources :bookings
end
这样做之后,如果您从命令行运行rails路由,现在您将看到一个新的路由new_spot_booking_path
,并且您可以在模板中使用它作为new_spot_booking_path(spot)。
看一下https://guides.rubyonrails.org/routing.html#nested-resources和路由的一般情况
祝你好运!
Rails解决这个问题的方法是创建一个嵌套路由:
resources :spots do
resources :bookings, shallow: true
end
这将创建路径/spots/:spot_id/bookings
,这意味着spot id将作为URL的一部分传递。
class BookingsController < ApplicationRecord
before_action :set_spot, only: [:new, :create, :index]
before_action :set_booking, only: [:show, :edit, :update, :destroy]
# GET /spots/1/bookings/new
def new
@booking = @spot.bookings.new
end
# POST /spots/1/bookings
def create
@booking = @spot.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 was successfully created." }
format.json { render :show, status: :created, location: @booking }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @booking.errors, status: :unprocessable_entity }
end
end
end
private
def set_spot
@spot = Spot.find(params[:spot_id])
end
def set_booking
@booking = Booking.find(params[:id])
end
def booking_params
params.require(:booking)
.permit(:starts_at)
end
end
# app/views/bookings/new.html.erb
<%= render partial: 'form' %>
# app/views/bookings/_form.html.erb
<%= form_with(model: [@spot, @booking]) |form| %>
# ...
<%= form.submit %>
<% end %>