【问题标题】:How can I reload the current page in Ruby on Rails?如何在 Ruby on Rails 中重新加载当前页面?
【发布时间】:2011-09-18 23:51:17
【问题描述】:

我目前在我网站的每个页面上的标题栏中都有一个登录弹出窗口。我希望能够在成功登录后重新加载该人所在的当前页面。如何在控制器中执行此操作?

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

谢谢

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-3 url-routing


【解决方案1】:

对于我的应用程序,我使用redirect_to :back,它就可以了。但是,我怀疑这在非一般用例中可能存在错误(用户来自特殊页面?),但到目前为止我还没有在我的应用程序中找到它。

【讨论】:

  • 这对我有用。您不会重新加载当前页面,就像您要执行创建操作然后再返回一样...如果您使用 AJAX,那么您只需更新显示花花公子登录的部分...和让他留在那个页面上。
  • 对于 Rails 5,redirect_to :back 已被弃用以在 5.1 中删除,而应使用 redirect_back(fallback_location: fallback_location)
【解决方案2】:

如果您正在寻找一种通过 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

【讨论】:

    【解决方案3】:

    在 Rails 5 中 redirect_to :back is improved 通过:

        redirect_back(fallback_location: root_path)
    

    【讨论】:

    • 它适用于 2020 年的 Rails 6,顺便说一句 redirect_to :back 似乎不适合我
    【解决方案4】:

    Archonic 上面的回答对我有用。但是,在 Rails 3 中,我不得不将它放在 respond_to 块中,以避免出现“ArgumentError(参数太少)”错误:

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

    【讨论】:

      【解决方案5】:

      从 Rails 5(或者可能是旧版本)开始,您就有了 request.referrer 方法。您只需从控制器重定向到引用者,它就会打开请求来自的页面。

      redirect_to request.referrer, notice: "You're being redirected"

      【讨论】:

        【解决方案6】:

        Rails 5 引入了替代功能:

        redirect_back(fallback_location: root_path)
        

        只要知道 HTTP_REFERER,它就会重定向回来。 否则它会重定向到 fallback_location。

        redirect_to :back 在 Rails 5.0 中已弃用 https://github.com/rails/rails/pull/22506,并从 Rails 5.1 中删除

        【讨论】:

          【解决方案7】:

          这种语法就是你想要的...在 Rails 6 中工作

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

          【讨论】:

          • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
          • 这个解决方案非常适合我的 rails 6 应用程序!你是在哪里碰巧遇到这种方法的?找我花了好长时间。
          【解决方案8】:

          基于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
          

          【讨论】:

            【解决方案9】:

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

            redirect_to what_ever_path

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-03-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-02-22
              • 2015-05-08
              • 2018-04-22
              • 1970-01-01
              相关资源
              最近更新 更多