我正在处理订单系统,我使用实例变量(例如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
传递到确认页面的所有变量都将丢失。我知道我可以重新创建它们,但有没有更好的方法来保存这些信息?非常感谢你!
答案 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");