如何在单独的控制器显示页面中显示创建页面/表单?

时间:2018-11-01 06:27:27

标签: ruby-on-rails ruby

我希望能够直接从列表显示页面创建订单,而不必直接转到新的订单页面。

我有一个清单(listingcontroller show方法),可以通过单击按钮进入订单页面(orderscontroller创建方法)进行购买。

我可以通过哪种方式直接在商品展示页面上获得订购单?

我尝试添加表单,但出现错误:

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

当我采用Orders控制器create方法并将其放入Listings Controller Show方法时,出现此错误:

Couldn't find Listing without an ID

这是清单显示页面中我想要的form_for:

    <%= 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

我尝试使用订单创建方法,然后将其插入带有“ def create”(不创建)的清单show方法中。我在创建方法之前放置了“ @listing = Listing.find(params [:listing_id])”(当使用“ def create”时,我仍然会收到错误,它需要一个id。即使我收到该错误,在网页底部的请求显示列表ID在其中。

我尝试使用表单中的隐藏字段,但对我不起作用。

我是否需要对控制器做一些事情,或者是否可以通过某种方式将:listing_id加载到表单中。对于您中的某些人来说,这可能是非常快速和简单的事情,但是为什么不将其加载到商品展示页面中,却又将其加载到订单创建页面中呢?

2 个答案:

答案 0 :(得分:1)

您可以通过使用AJAX调用来实现这一点,在该调用中您将传递orders操作和其他参数的URL。不会重新加载页面,您将在列表页面上获得正确的功能。

Here是查看链接-AJAX调用的工作方式。

答案 1 :(得分:1)

简便的方法。

您在 listing_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 %>

通过这种方式,您可以在提交表单之前在内存中创建到清单的订单。您可以将列表ID添加为隐藏字段。

提交订单后,您可以通过以下方式修改 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