【问题标题】:Rails Redirect Not Going as HTMLRails 重定向不是 HTML
【发布时间】: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


【解决方案1】:

因为您在通过ajax 提交的表单上有remote: true,所以您还没有说如果通过ajax 提交并成功了该怎么办。请求的格式是 js 而不是 html,这就是重定向不起作用的原因。

如果成功,您需要创建一个 create.js.erb 文件以提供服务,并使用 window.location = "wherever you want to go" 处理通过 javascript 的重定向

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 2018-01-14
    相关资源
    最近更新 更多