我希望能够直接从列表显示页面创建订单,而不必直接转到新的订单页面。
我有一个清单(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加载到表单中。对于您中的某些人来说,这可能是非常快速和简单的事情,但是为什么不将其加载到商品展示页面中,却又将其加载到订单创建页面中呢?
答案 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