Hun*_*ter 6 javascript format redirect ruby-on-rails
我有一个注册表单,如果注册成功,应该将用户重定向到他们的个人资料.如果注册失败,我想在不使用Javascript重新加载页面的情况下发出错误消息.
这是我的表单标题:
<%= form_for resource, as: resource_name, url: registration_path(resource_name), remote: true do |f| %>
Run Code Online (Sandbox Code Playgroud)
我的注册管理员:
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
Run Code Online (Sandbox Code Playgroud)
所以失败有效.它在表单上方显示错误消息而不重新加载页面.注册成功format.html { redirect_to current_employer }时不工作.
我的服务器日志说重定向已经处理:
Redirected to http://localhost:3000/employers/27
Run Code Online (Sandbox Code Playgroud)
但看起来我的Employers控制器上的show动作被称为Javascript:
Processing by EmployersController#show as JS
Run Code Online (Sandbox Code Playgroud)
因此,当我提交表单时,它不会将我重定向到我的个人资料页面.页面不闪烁.我登录但是,如果我刷新页面,则表明我已登录.
顺便说一句,我正在使用Devise,我的注册控制器是对Devise使用的修正.
不知道为什么这不起作用.我已经取出了format.js {}部分,它仍然通过JS向我的雇主#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
Run Code Online (Sandbox Code Playgroud)
这也提高了代码的可重用性.
因为你remote: true在表单上有它是通过ajax提交的,所以如果通过ajax提交并成功,你还没有说要做什么.请求的格式是js而不是html,这就是重定向不起作用的原因.
如果成功,您需要创建一个create.js.erb文件,通过javascript处理重定向 window.location = "wherever you want to go"