更新后设计更改重定向

时间:2014-01-16 18:00:42

标签: ruby-on-rails ruby model-view-controller devise ruby-on-rails-4

我在Devise的github上尝试过代码。在我的应用程序控制器中,我有:

after_filter :store_location

def store_location
  # store last url - this is needed for post-login redirect to whatever the user last visited.
  if (request.fullpath != "/users/sign_in" &&
      request.fullpath != "/users/sign_up" &&
      request.fullpath != "/users/password" ) 
    session[:previous_url] = request.fullpath 
    puts 'stores location'
  end
end

def after_update_path_for(resource)
  session[:previous_url] || dashboard_path
  puts 'after update'
end

当我检查我的服务器时,会出现store_location方法中的puts语句,但来自after_update_path_for的puts语句却没有。如何让after_update_redirect工作?

以下是设计要做的事情,但它不起作用:

https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update

5 个答案:

答案 0 :(得分:3)

以下是我如何解决问题:

class RegistrationsController < Devise::RegistrationsController

    protected

    def after_update_path_for(resource)
        puts 'this is happening yoyo mama'
        flash[:notice] = "Account succesfully updated"
        edit_user_registration_path
    end
end

路线:

devise_for :users, :controllers => { :registrations => :registrations }

唯一的问题是,如果更改密码成功,这只会进行重定向。如果不是,则不会发生重定向。有没有人知道怎么做,所以如果有错误也会发生重定向?

答案 1 :(得分:2)

来自文档:

  

(对象)after_update_path_for(资源)(受保护)
  更新资源后要使用的默认URL。您需要在自己的RegistrationsController中覆盖此方法。

所以创建你的注册控制器是正确的。这是一个更简单的解决方案:

after_update_path_for来电signed_in_root_path(resource),看起来像一个家#{scope}_root_path。这里的范围通常是user(但如果不是,你可能知道它是什么)。对于“用户”,在应用程序控制器中实施user_root_path,返回dashboard_url即可。

def user_root_path
  dashboard_url
end

虽然起初对我来说似乎有些迟钝,但我相信它确实很“不错”;用户范围的根路径确实可以是仪表板页面。

答案 2 :(得分:1)

根据Devise docs,覆盖默认值并添加路线。除非你想要改变它,否则不需要设置flash消息。

# Example subclass/override (registrations_controller.rb)
class Users::RegistrationsController < Devise::RegistrationsController

  protected

  def after_update_path_for(resource)
    user_path(resource)
  end
end

# Example routing config (in routes.rb):
devise_for :users, :controllers => { :registrations => :registrations }

答案 3 :(得分:0)

respond_with resource, :location => after_update_path_for(resource)是在更新后设置重定向路径的代码。要更改默认重定向,请通过添加以下代码覆盖应用程序控制器中的以下方法

def after_update_path_for(resource_or_scope)
  dashboard_url
end

答案 4 :(得分:0)

覆盖ApplicationController中的路由对我来说也不起作用,但将其添加到Users :: RegistrationsController工作。 例如,

class Users::RegistrationsController < Devise::RegistrationsController
def after_update_path_for(resource)
    current_user
end

在相关的说明中,after_sign_in_path可以添加到SessionsController

class Users::SessionsController < Devise::SessionsController
def after_sign_in_path_for(resource)
  current_user
end

我的路线看起来像这样:

devise_for :users, controllers: {
  confirmations: "users/confirmations",
  passwords: "users/passwords",
  registrations: "users/registrations",
  sessions: "users/sessions",
  unlocks: "users/unlocks",
}