【发布时间】:2014-06-04 13:29:15
【问题描述】:
我有一个注册表单,如果注册成功,应该将用户重定向到他们的个人资料。如果注册失败,我想在不使用 Javascript 重新加载页面的情况下发布错误消息。
这是我的表单标题:
<%= form_for resource, as: resource_name, url: registration_path(resource_name), remote: true do |f| %>
我的注册控制器:
def create
respond_to do |format|
if resource.saved
sign_up(resource_name, resource)
format.html { redirect_to current_employer }
else
format.js { render 'employers/sign_up_failure' }
end
end
end
所以失败起作用了。它会在表单上方显示一条错误消息,而无需重新加载页面。
注册成功format.html { redirect_to current_employer }不起作用。
我的服务器日志显示重定向已处理:
Redirected to http://localhost:3000/employers/27
但看起来我的 Employers 控制器上的显示操作被称为 Javascript:
Processing by EmployersController#show as JS
因此,当我提交表单时,它不会将我重定向到我的个人资料页面。页面不闪烁。虽然我已经登录,所以如果我刷新页面,它会显示我已登录。
顺便说一句,我正在使用 Devise,我的注册控制器是对 Devise 使用的修改。
不知道为什么这不起作用。我已经取出了format.js {} 部分,它仍然通过 JS 向我的 Employers#Show 操作发送 GET 调用。我想要的是将重定向格式化为 HTML 并将我带到个人资料页面。
有什么想法吗?
解决方案
谢谢你的帮助。面对手掌,我完全忘记了remote: true 的工作原理。这是我实施的解决方案...希望有人觉得这很有用。
def create
respond_to do |format|
if resource.saved
sign_up(resource_name, resource)
#CHANGED
format.js { render js: "window.location.href = '/#{resource_name}s/#{resource.id}'" }
else
format.js { render "#{resource_name}s/sign_up_failure" }
end
end
end
这也提高了代码的可重用性。
【问题讨论】:
-
您的表单上有
remote: true。您的表单将始终由 Ajax 提交,而不是由浏览器的正常提交机制提交,因此 format.html 将永远无法工作。您将不得不通过 javascript 处理重定向
标签: javascript ruby-on-rails redirect format