如何在Ruby on Rails中重新加载当前页面?

57

我目前在我的网站的每个页面上都有一个登录弹出框,我想在成功登录后重新加载当前页面。在控制器中如何实现这一点?

def create
  #declaring and defining user variable stuff
  if user.save
    #reload current page <--how do I do this?
  end
end
感谢。

这是一个可能有帮助的答案。 - Salma Gomaa
9个回答

58

对于我的应用程序,我使用redirect_to :back并且它能够达到预期效果。然而,我怀疑在某些特殊情况下(例如用户来自特殊页面),这可能会导致错误,但是目前我在我的应用程序中还没有发现这个问题。


2
这对我也有效。你并没有重新加载当前页面,而是进入了一个创建操作,然后再返回来...如果你使用AJAX,那么你只需要更新显示已登录用户的部分...并让他留在那个页面上。 - pjammer
2
redirect_to的文档:http://api.rubyonrails.org/classes/ActionController/Redirecting.html - Nate
38
对于Rails 5,redirect_to :back已被弃用并将在5.1中移除,应使用redirect_back(fallback_location: fallback_location)来代替。 - DuckNG

51

如果你想要通过XHR请求刷新页面(通常是redirect_to :back),你不需要寻找改变响应类型的方法 - 只需使用内联JS告诉页面重新加载即可。

format.js { render inline: "location.reload();" }

Elena提到的那样,这应该被放在一个respond_to代码块中,如下所示:

respond_to do |format|
  format.js {render inline: "location.reload();" }
end

1
无论怎么点赞都不够! - Liz

28

在Rails 5中,redirect_to :back通过以下方式得到了改进:redirect_back

    redirect_back(fallback_location: root_path)

它在2020年与Rails 6很好地配合使用,顺便说一句,redirect_to :back对我似乎不起作用。 - Chau Giang
值得注意的是,闪现消息也可以与此方法一起使用,例如:redirect_back fallback_location: root_path, notice: "完成任务" - Simone

20
自 Rails 5(或可能是早期版本)以来,您可以使用 request.referrer 方法。您只需从控制器重定向到引用者并打开请求来源页面即可。 redirect_to request.referrer, notice: "您正在被重定向"

17

Archonic的答案对我有用。然而,在Rails 3中,我必须将这个放在respond_to块中,以避免出现 'ArgumentError(参数过少)'错误:

respond_to块中需要放置此代码以避免错误:

respond_to do |format|
  format.js {render inline: "location.reload();" }
end

7
Rails 5引入了一种替代函数:
redirect_back(fallback_location: root_path)

每当HTTP_REFERER已知时,它会重定向回去。否则,它将重定向到fallback_location。
在Rails 5.0中,redirect_to :back已被弃用,详情见https://github.com/rails/rails/pull/22506,并且自Rails 5.1开始已被移除。

3

这是你想要的语法...在Rails 6中可用

  respond_to do |format|
    format.html { redirect_to request.referrer, notice: "User was successfully WHATEVER." }
  end

虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - Donald Duck
这个解决方案非常适用于我的Rails 6应用程序!你是从哪里得知这个方法的?我找了很久才找到。 - anthony

0

只需在函数中重定向到您想要的任何URL:

redirect_to what_ever_path


0

ArchonicElena的答案基础上,reload函数接受一个参数来强制从服务器重新加载页面,即forceGet,而不是从缓存中获取。控制器逻辑可以设置参数,例如用户成功或失败的登录,以触发发送到页面时所需的行为。

# force_get = controller_logic ? true : false

respond_to do |format|
  format.js { render inline: "location.reload(#{force_get});" }
end

更新: forceGet选项的逻辑已被弃用。如果您确实想要从服务器重新加载,可以使用以下逻辑:

# force_get = controller_logic ? true : false

respond_to do |format|
  format.js { render inline: force_get ? "window.location.href = window.location.href;" : "location.reload();" }
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接