В вашем routes.rb
просто выполните:
resources :bookings
Что даст вам:
bookings GET /bookings(.:format) bookings#index
POST /bookings(.:format) bookings#create
new_booking GET /bookings/new(.:format) bookings#new
edit_booking GET /bookings/:id/edit(.:format) bookings#edit
booking GET /bookings/:id(.:format) bookings#show
PATCH /bookings/:id(.:format) bookings#update
PUT /bookings/:id(.:format) bookings#update
DELETE /bookings/:id(.:format) bookings#destroy
Затем сделайте это:
link_to "#{user.name}", booking_form_path(@user)
больше похоже на:
link_to @user.name, new_booking_path(cleaner_id: @user.id, host_id: current_user.id)
Пара заметок:
- Это предполагает, что у вас есть
@user
, доступный для вас (вы ссылаетесь на user
и @user
- возможно, это одно или другое, и, вероятно, вы получаете сообщение об ошибке, о котором упоминаете в своем комментарии, если @user
nil
по некоторым причинам).
- Нет необходимости использовать интерполяцию строк в
user.name
- Дополнительные пары ключ / значение, включенные в ваш
new_booking_path
(или любой другой путь), добавляются к URL-адресу в качестве параметров запроса и отображаются в вашем params
.
- Попробуйте использовать стандартные маршруты RESTful. Нет нужды в
booking_form
, тогда для этого new_booking_path
. Точно так же вам не нужно create_booking_path
, потому что у вас уже есть bookings_path
, который будет перенаправлять на ваше действие create
, когда вы POST
будете заполнять форму.
При этом вы должны увидеть :cleaner_id
и :host_id
в параметрах вашего действия new
при нажатии на ссылку.
Затем в вашем new
действии сделайте что-то вроде:
class BookingsController < ApplicationController
def new
@cleaner = User.find(params[:cleaner_id])
@host = current_user
@booking = Booking.new
end
end
Теперь, в вашей форме, вы можете сделать что-то вроде:
<h1 style='text-align:center'>Book <%= @cleaner.name %> for a cleaning </h1>
<%= bootstrap_form_for @booking do |f| %>
<%= f.text_area :notes,
rows: 6,
minlength: 5,
maxlength: 1000,
placeholder: 'Leave a note for your cleaner!',
class: 'form-control' %>
<%= f.hidden_field :cleaner_id, value: @cleaner.id %>
<%= f.hidden_field :host_id, value: @host.id %>
<%= f.submit "Book Now!", id:'client-btn', class: 'form-control btn btn-primary' %>
<% end %>
@cleaner_id
и @host_id
теперь являются скрытыми полями и будут отправлены и доступны в вашем действии BookingController
create
. Возможно, вам придется немного поиграть с этим синтаксисом.
Честно говоря, я не знаю, почему вы занимаетесь этим host
бизнесом, когда host
всегда разрешается до current_user
. Но я уверен, что у тебя есть свои причины.
Думаю, на вашем месте я бы сделал:
resources :cleaners do
resources :bookings, shallow: true
end
Что даст вам:
cleaner_bookings GET /cleaners/:cleaner_id/bookings(.:format) bookings#index
POST /cleaners/:cleaner_id/bookings(.:format) bookings#create
new_cleaner_booking GET /cleaners/:cleaner_id/bookings/new(.:format) bookings#new
edit_booking GET /bookings/:id/edit(.:format) bookings#edit
booking GET /bookings/:id(.:format) bookings#show
PATCH /bookings/:id(.:format) bookings#update
PUT /bookings/:id(.:format) bookings#update
DELETE /bookings/:id(.:format) bookings#destroy
cleaners GET /cleaners(.:format) cleaners#index
POST /cleaners(.:format) cleaners#create
new_cleaner GET /cleaners/new(.:format) cleaners#new
edit_cleaner GET /cleaners/:id/edit(.:format) cleaners#edit
cleaner GET /cleaners/:id(.:format) cleaners#show
PATCH /cleaners/:id(.:format) cleaners#update
PUT /cleaners/:id(.:format) cleaners#update
DELETE /cleaners/:id(.:format) cleaners#destroy
Если вам не нужны эти cleaners
пути, просто сделайте:
resources :cleaners, only: [] do
resources :bookings, shallow: true
end
Тогда:
link_to @user.name, new_cleaner_booking_path(@user)
Ваш контроллер:
class BookingsController < ApplicationController
def new
@cleaner = User.find(params[:cleaner_id])
@booking = Booking.new
end
end
И ваша форма:
<h1 style='text-align:center'>Book <%= @cleaner.name %> for a cleaning </h1>
<%= bootstrap_form_for [@cleaner, @booking] do |f| %>
<%= f.text_area :notes,
rows: 6,
minlength: 5,
maxlength: 1000,
placeholder: 'Leave a note for your cleaner!',
class: 'form-control' %>
<%= f.submit "Book Now!", id:'client-btn', class: 'form-control btn btn-primary' %>
<% end %>
Теперь у вас должно быть cleaner_id
в вашем create
действии, и вы можете использовать current_user
в качестве host