Присоединение: id param к GET-запросу и возвращение пользователя в поле зрения - PullRequest
0 голосов
/ 21 июня 2019

В моем приложении есть таблица со списком пользователей.

Используя метод link_to, я хочу иметь возможность щелкнуть имя пользователя, сохранить определенный параметр этого пользователя, а также current_user (пользователь, вошедший в систему).

Имя пользователя, на которое нужно щелкнуть в таблице, должно иметь: id параметра, сохраненный вместе с идентификатором current_user.

Страница, на которую current_user направляется, отображает форму, которая после отправки должна создать новый объект Booking, присваивающий значение, переданное через text_area, называемое notes, в поле :notes и должно присвойте параметры user и current_user: id двум полям в модели бронирования, которые называются cleaner_id и host_id соответственно после отправки.

Вот что я пробовал,

В файле rout.rb:
get 'show_booking_form/:id', to: 'bookings#show', as: 'booking_form'
Это должно направить пользователя к форме бронирования. В заголовке формы бронирования должно отображаться имя пользователя таблицы.

Вот поле таблицы, в котором отображается пользователь таблицы:
<td><%= link_to "#{user.name}", booking_form_path(@user) %></td>
После нажатия, это должно сохранить два параметра 1. Идентификатор current_user, (вошедший в систему пользователь делает щелчок) (хост-пользователь) 2. Идентификатор user, (пользователь таблицы нажимается) (пользователь чище)

Вот действие контроллера заказов show, которое определяет хост и уборщика
def show @host = current_user @cleaner = User.find(params[:id]) end

Вот страница, на которую перенаправляется пользователь, и содержащая форму с именем более чистого пользователя в качестве заголовка. В этой форме должны быть указаны параметры current_user и table table как host_id и cleaner_id соответственно.

<h1 style='text-align:center'>Book <%= @cleaner.name %> for a cleaning </h1>
<%= bootstrap_form_for create_booking_path 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 %>
</div>

1 Ответ

1 голос
/ 21 июня 2019

В вашем 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...