Как отобразить страницу создания / форму на отдельной странице показа контроллеров? - PullRequest
0 голосов
/ 01 ноября 2018

Мне бы хотелось иметь возможность создавать заказы непосредственно со страницы показа объявлений, а не перенаправлять их на страницу новых заказов.

У меня есть листинг (метод showcontroller show), который можно приобрести, нажав кнопку, чтобы перейти на страницу заказов (метод orderscontroller create).

Каким образом я могу получить форму заказа непосредственно на странице показа объявлений?

Я пытался добавить форму, но я получаю сообщение об ошибке:

First argument in form cannot contain nil or be empty
<%= form_for([@listing, @order]) do |form| %>

Когда я беру метод создания Контроллера заказов и помещаю его в метод Показа Контроллера Листингов, я получаю эту ошибку:

Couldn't find Listing without an ID

Вот форма, которую я хочу найти на странице листинга:

    <%= form_for([@listing, @order]) do |form| %>
....

Контроллер заказов создать:

    @order = Order.new(order_params)
    @listing = Listing.find(params[:listing_id])
    @seller = @listing.user
    @order.listing_id = @listing.id
    @order.buyer_id = current_user.id
    @order.seller_id = @seller.id

...

Маршруты:

  resources :listings do
    resources :orders
end

модель листинга:

  has_many :orders

модель категории:

  has_and_belongs_to_many :listings

Я попытался взять метод create orders и вставить его в метод листингов show с def create и без. Я помещаю "@listing = Listing.find (params [: перечисление_id])" перед методом create (при использовании "def create", и я все равно получаю ошибку, ей нужен идентификатор. Даже когда я получаю эту ошибку, в В нижней части веб-страницы запрос показывает, что ID листинга находится там.

Я пытался использовать скрытое поле в форме, но у меня не получилось.

Нужно ли что-то делать с контроллерами или есть способ как-то загрузить: перечисление_id в форму. Возможно, это что-то очень быстрое и простое для некоторых из вас, но почему оно не загружается на странице показа списков, а прекрасно загружается на странице создания заказов?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Легкий подход.

Ваше действие показа в list_controller.rb должно иметь следующий код:

def show
  @listing = Listing.find(params[:listing_id])
  @order  = @listing.orders.build
  .
  .
  .
end

Ваши просмотры / объявления / show.erb должны иметь следующий код

<%= form_for(@order, url: listing_orders_path(@listing)) do |f| %> 
. 
. 
. 
<%= end %>

Таким образом, вы создаете заказ в списке (в памяти), прежде чем отправить форму. Вы можете добавить идентификатор записи в качестве скрытого поля.

После отправки заказа вы изменяете ваш orders_controller.rb таким образом:

def create
   @listing = Listing.find(params[:listing_id])
   @order = @listing.orders.build(params[...]) #select the params you need for the order creation. Since you create the order directly to the listing you don't need to add the listing_id to the order.

   if @order.save
            #do something
   else
            #do something
   end
end

Имейте в виду, что при непосредственном использовании params [] возникают проблемы с безопасностью, проверьте массовое назначение: https://guides.rubyonrails.org/v3.2.8/security.html

0 голосов
/ 01 ноября 2018

Вы можете достичь этого с помощью вызова AJAX, где вы передадите URL-адрес действия orders и другие параметры. Там не будет перезагрузки страницы, и вы получите функциональность прямо на странице списков.

Здесь - ссылка для просмотра - как работают вызовы AJAX.

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