POST 数据然后导航到新页面并将所述数据保留在 Rails 中,而不使用数据库?

问题描述 投票:0回答:1

我知道 POST 请求并不用于导航,但我只是想检查我所承担的任务是否可行。

我的 Rails 应用程序中有一个页面 - 我们称之为

cars#index
。我需要在此页面上选择汽车,然后提交选择并转到
car_sales
的新页面,我的选择列在另一个表中。

我有一个可以选择汽车的表格,然后想要发布此数据,在

car_sales#new
处呈现一个新页面 - 包含我之前选择的汽车的列表。

这可能吗?

   # POST car_sales#new

   def new
    @cars = Car.where(id: selected_car_id_params)

    respond_to do |format|
      format.html
    end
   end

通常,您将发布到创建操作,然后该操作将重定向到其他页面,该页面将查询保存在数据库中的汽车。这里的区别是我还不想保留在数据库中。

我已经从我的

cars#index
页面发布数据,除了网络选项卡中返回的是
car_sales#new
页面的 HTML - 即浏览器停留在同一页面上,但不会重定向。

有人可以提供发生这种情况的技术原因吗?

这是我的索引方法,尽管我认为它与这里无关:-

   # GET cars#index

   def index
    @cars = Car.all
   end
html ruby-on-rails ruby http ruby-on-rails-4
1个回答
1
投票

只需添加额外的 POST 路由即可轻松实现这一点。

resources :car_sales do
  post :new
end
# GET  /car_sales/new
# POST /car_sales/new
def new
  # @todo rewrite so it checks if param is present.
  @cars = Car.where(id: selected_car_id_params)
  respond_to do |format|
    format.html
  end
end
<%= form_with(url: new_car_sales_path, method: :post, data: { turbo: false }) do |form| %>
  # ...
<% end %>

然而,它实际上只是引出了一个问题“但是为什么?”。您不需要使用

POST
来进行幂等的表单提交。您可以只使用标准的 GET 路由。

通常,您将发布到创建操作,然后该操作将重定向到其他页面,该页面将查询保存在数据库中的汽车。这里的区别是我还不想保留在数据库中。

没有什么强迫您坚持任何事情来响应表单提交。这只是惯例。您实际上也不需要保留任何内容,因为您想要做的只是使用附加输入来渲染视图。

参数也可以通过查询字符串或会话转发 - 如果您确实需要它(您不需要)。

我已经从 cars#index 页面发布了数据,除了网络选项卡中返回的是 car_sales#new 页面的 HTML - 即浏览器停留在同一页面上,但不会重定向。

你期待的是错误的事情。表单提交不会导致重定向。这是对服务器的 GET/POST 请求,服务器可以根据需要响应它。

在您的情况下,控制器隐式渲染视图作为响应并发送默认的

200 - OK
状态代码。如果您确实想要重定向(您不需要),服务器需要使用
3XX
状态代码和位置标头进行响应,您可以使用
redirect_to
进行响应。

至于为什么客户端没有渲染新视图,我只能猜测该请求是作为 XHR 请求发送的,或者您实际上没有发送正确的请求或渲染您认为的内容。

© www.soinside.com 2019 - 2024. All rights reserved.