我有一个注册表单,如果注册成功,应该将用户重定向到他们的个人资料。如果注册失败,我想在不使用 Javascript 重新加载页面的情况下显示错误消息。
这是我的表单标题:
<%= form_for resource, as: resource_name, url: registration_path(resource_name), remote: true do |f| %>
我的注册 Controller :
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 Controller 上的 show Action 被调用为 Javascript:
Processing by EmployersController#show as JS
因此,当我提交表单时,它不会将我重定向到我的个人资料页面。页面不闪烁。不过我已经登录了,所以如果我刷新页面,它会显示我已登录。
顺便说一句,我正在使用 Devise,我的注册 Controller 是对 Devise 使用的修正。
不确定为什么这不起作用。我取出了 format.js {}
部分,它仍然通过 JS 将 GET 调用发送到我的 Employers#Show 操作。我想要的是将重定向格式化为 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
这也提高了代码的可重用性。
最佳答案
因为您在通过 ajax 提交的表单上有 remote: true
,所以您还没有说明如果通过 ajax 提交并成功该怎么做。请求的格式是 js 而不是 html,这就是重定向不起作用的原因。
如果成功,您需要创建一个 create.js.erb 文件来提供服务,使用 window.location = "wherever you want to go"
关于javascript - Rails 重定向不作为 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24038798/