Rails:在帖子操作失败后保持在同一页面

时间:2018-01-16 02:44:32

标签: ruby-on-rails

我正在处理订单系统,我使用实例变量(例如orders#confirm)将一些新订单的信息从控制器(@detail)传递到确认页面。在确认页面上,用户应该确认信息并提交表单以创建新订单(orders#create)。如果帖子操作失败,我希望它保留在同一个确认页面上并保留用户页面上的所有信息:

  def create
    @order = Order.new(order_params)
    if verify_recaptcha(model: @order) && @order.save
      redirect_to items_url
    else
      render :confirm
    end
  end

代码无效,因为我从orders#confirm传递到确认页面的所有变量都将丢失。我知道我可以重新创建它们,但有没有更好的方法来保存这些信息?非常感谢你!

1 个答案:

答案 0 :(得分:0)

在您的方法中,您必须重建当前操作@detail中的create对象,才能使confirm.html.erb视图正确呈现。

有可能。但是,我认为有一种更好的方法可以让用户通过AJAX确认订单(使用Rails很简单),这样如果确认失败,用户就可以留在页面上。

confirm.html.erb中,假设您有一个表单让用户确认,只需将其更改为remote: true

<%= form_for @order, remote: true, format: :js do |form| %>
  <%# blah blah %>
<% end %>

修改您的控制器

def create
  @order = Order.new(order_params)
  if verify_recaptcha(model: @order) && @order.save
    # Redirect when success
    render js: "window.location = '#{your_desired_path}'"
  else
    # Display error to user.
    render "ajax_create_error", status: :bad_request
  end
end

现在,您可以创建文件名ajax_create_error.js.erb以向用户显示错误

# app/views/your_controller_name/ajax_create_error.js.erb
alert("Cannot create order");