Ruby on rails 加上“;谢谢您的订单;不可直接访问的页面

Ruby on rails 加上“;谢谢您的订单;不可直接访问的页面,ruby-on-rails,ruby,Ruby On Rails,Ruby,当用户购买商品时,我们希望显示感谢页面。 然后,我们再次希望此页面不可直接访问。 换句话说,如果页面是/orders/thankyou,用户可以直接导航到它,这将是相当丑陋的,并且失败,因为它将没有任何显示 如何仅在上下文中显示此页面并禁止直接导航到它?您可以创建一个部分表单,并在触发购买事件后将其附加到DOM中。在部分视图中,如果在未触发购买事件的情况下访问重定向操作,请确保添加重定向操作。对于仅显示短文本(而不是订单数据),您可以使用flash通知。例如: redirect_to @page

当用户购买商品时,我们希望显示感谢页面。 然后,我们再次希望此页面不可直接访问。 换句话说,如果页面是/orders/thankyou,用户可以直接导航到它,这将是相当丑陋的,并且失败,因为它将没有任何显示


如何仅在上下文中显示此页面并禁止直接导航到它?

您可以创建一个部分表单,并在触发购买事件后将其附加到DOM中。在部分视图中,如果在未触发购买事件的情况下访问重定向操作,请确保添加重定向操作。

对于仅显示短文本(而不是订单数据),您可以使用flash通知。例如:

redirect_to @page, notice: "Thank you for your order!"
Ajax

听起来您最好使用
ajax

#app/views/cart/index.html.erb
<%= form_tag cart_order_path, remote: true do |f| %>
   ... (cart form)
   <%= f.submit %>
<% end %>
这里的诀窍是在没有布局的情况下呈现感谢视图-

#app/controllers/cart_controller.rb
class CartController < ApplicationController
   respond_to :js, only: :create

   def create
      ... business logic here
      render "thank_you", layout: false
   end
end
#app/controllers/cart_controller.rb
类CartController<应用程序控制器
回复:js,仅::create
def创建
... 这里的业务逻辑
渲染“谢谢”,布局:false
结束
结束
这将在不使用任何支持的“布局”HTML的情况下呈现所需的视图,从而使您有机会将其附加到当前视图中。这意味着,如果您想显示“谢谢”视图,而不让用户直接浏览到它-这就是您要做的


它的工作原理

是一种javascript技术,基本上允许您向Rails后端发送“伪请求”:

与标准HTTP请求基本相同,除了使用Javascript处理外,Ajax使您能够在应用程序中创建“无刷新”功能的外观。它通过Javascript代表您发送请求来实现这一点

Ajax通常用于web界面上的一小部分功能,通过它,您可以向服务器发送简单的请求,获得可比较的响应,然后您可以将其应用到web界面中


这就是我一直建议的功能——通过该功能,您可以向控制器发送请求(尽管使用
Rails-UJS引擎),然后您将收到响应。然后可以将此响应输入到您的页面中,从而使您能够在不刷新用户的情况下显示“谢谢”页面。

您可以使用以下任何解决方案:

使用:

show.js.haml
文件中使用(假设您在
orders\u controller.rb
中使用操作
show
):


然后将
response\u添加到:js,only::show
,并在
orders\u controller.rb的
show
操作中添加
format.js
,您可以为此创建部分表单。。把这个条件放在你的控制器中,希望它解决了你的问题。在我们的例子中,我们希望重定向到订单屏幕之外,因为这是在不同主机上的SSL安全页面上完成的。我们想导航回我们的url。哦,好的!您是否尝试过使用
redirect\u to
,如
Suomi
的答案?我们希望显示所有订单数据和其他信息,因为订购在另一台主机上进行,Flash[:notice]对我们不起作用。(很抱歉没有提及这一点)。因此,用户将不得不导航回我们的主机,而不会看到通知。如果他在同一个会话中再次购买,他甚至会在下一个购买订单之前在新主机上看到此消息(如果显示)。重定向到和js会起作用,但我们不想打开可能被弹出窗口阻止程序抑制的新窗口。虽然跳过警报您提出的解决方案对我们有效,但我们将继续使用Stephen Bagsic的解决方案。
#app/controllers/cart_controller.rb
class CartController < ApplicationController
   respond_to :js, only: :create

   def create
      ... business logic here
      render "thank_you", layout: false
   end
end
flash[:notice] = "Thank you for your order!"
redirect_to @page
redirect_to @page, notice: "Thank you for your order!"
alert("Thank you for your order!");