ruby-on-rails 如何在Ruby On Rails中重定向到上一页?

niknxzdl  于 2022-12-30  发布在  Ruby
关注(0)|答案(9)|浏览(197)

我有一个页面,列出了所有的项目,有可排序的标题和分页。

path:
/projects?order=asc&page=3&sort=code

我选择编辑其中一个项目

path:
projects/436/edit

当我点击页面上的保存时,它会调用projects controller / update方法,在我更新代码后,我想重定向到我点击编辑一个特定项目之前的路径,换句话说,我想在相同的页面上,使用相同的排序。
我看到link_to(:back),认为:back可以在redirect_to(:back)中工作,但这是行不通的。

puts YAML::dump(:back) 
yields the following:
:back

我怎样才能让它工作?

fnatzsnv

fnatzsnv1#

在编辑操作中,将请求URL存储在会话哈希中,该哈希可用于多个请求:

session[:return_to] ||= request.referer

然后在成功保存后,在更新操作中重定向到它:

redirect_to session.delete(:return_to)
camsedfj

camsedfj2#

为什么redirect_to(:back)不适合你,为什么它是一个不去?
redirect_to(:back)对我来说就像一个护身符,它只是redirect_to(request.env['HTTP_REFERER'])的一个捷径
http://apidock.com/rails/ActionController/Base/redirect_to(导轨3之前)或http://apidock.com/rails/ActionController/Redirecting/redirect_to(导轨3)
请注意,redirect_to(:back)在Rails 5中已被弃用。
改为redirect_back(fallback_location: 'something')(请参见http://blog.bigbinary.com/2016/02/29/rails-5-improves-redirect_to_back-with-redirect-back.html

pu82cl6c

pu82cl6c3#

我喜欢Jaime的方法,但有一个例外,每次重新存储referer对我来说效果更好:

def edit
    session[:return_to] = request.referer
...

原因是如果你编辑多个对象,你总是会被重定向回你用Jaime的方法存储在会话中的第一个URL。例如,假设我有对象Apple和橙子。我编辑Apple,session[:return_to]被设置为该操作的引用。当我使用相同的代码编辑Oranges时,session[:return_to]不会被设置,因为它已经被定义了。所以当我更新橙子的时候,我会被发送到之前的苹果#编辑操作的引用者。

vd2z7a6w

vd2z7a6w4#

这就是我们在应用程序中的操作方式

def store_location
  session[:return_to] = request.fullpath if request.get? and controller_name != "user_sessions" and controller_name != "sessions"
end

def redirect_back_or_default(default)
  redirect_to(session[:return_to] || default)
end

这样,您只将最后一个GET请求存储在:return_to会话参数中,因此所有表单,即使是多次POST,也可以使用:return_to

iyfjxgzm

iyfjxgzm5#

在rails 5中,按照Rails指南中的说明,您可以用途:

redirect_back(fallback_location: root_path)

“back”位置是从HTTP_REFERER标头中提取的,不保证浏览器会设置该标头。这就是为什么您应该提供“fallback_location”的原因。

iyr7buue

iyr7buue6#

request.referer由机架设置,设置如下:

def referer
  @env['HTTP_REFERER'] || '/'
end

只要执行redirect_to request.referer,它将总是重定向到真正的引用页面,或者root_path('/'),这在通过测试失败时是很重要的,因为direct-nav是指向一个特定的页面,在这个页面中控制器抛出redirect_to:back

czfnxgou

czfnxgou7#

对于那些感兴趣的人,这里是我的实现,扩展了MBO的原始答案(针对rails 4.2.4,ruby 2.1.5编写)。

class ApplicationController < ActionController::Base
  after_filter :set_return_to_location

  REDIRECT_CONTROLLER_BLACKLIST = %w(
    sessions
    user_sessions
    ...
    etc.
  )

  ...

  def set_return_to_location
    return unless request.get?
    return unless request.format.html?
    return unless %w(show index edit).include?(params[:action])
    return if REDIRECT_CONTROLLER_BLACKLIST.include?(controller_name)
    session[:return_to] = request.fullpath
  end

  def redirect_back_or_default(default_path = root_path)
    redirect_to(
      session[:return_to].present? && session[:return_to] != request.fullpath ?
        session[:return_to] : default_path
    )
  end
end
llycmphe

llycmphe8#

link_to 'get me back', :back

符号:back是你的瑞士军刀。

deikduxw

deikduxw9#

我不知道这是否可行

def edit
    if request.referer != request.original_url
        @return_here =  request.referer
    end

  end

并使用@return_here作为提交表单中的隐藏值。
当然,重新加载将杀死这一点,所以只需根据需要回到默认回退。

相关问题