【问题标题】:CanCan stopping Devise redirectCanCan 停止设计重定向
【发布时间】:2013-03-01 12:44:21
【问题描述】:

我正在为我的应用程序使用 Devise & CanCan。当用户登录时,他们会被带到他们的帐户页面 - 我为此设置了自定义重定向:

def after_sign_in_path_for(resource)
    url_for :controller => '/users', :id => current_user.id, :action => 'myaccount'
end

但是,当我尝试在用户注册时执行相同操作时 - 即使用 after_sign_up_path_for(resource),则会出现此错误:

 NoMethodError in UsersController#show

undefined method `user' for #<User:0x25d15e8>

指的是我为CanCan设置的ability.rb文件,如下:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user

    can :manage, :all do |all|
        all.try(:user) == user
    end

它说的是问题是 all.try(:user) == user。我不明白为什么这会导致问题?似乎无论我为重定向做什么,它总是会带我去例如{app}/users/22 并给出此错误。

【问题讨论】:

  • 您可能希望将其拆分为模型,而不是尝试这样做。如果您需要更新权限,以后会更容易阅读和操作。

标签: ruby-on-rails devise cancan


【解决方案1】:

按照SO post 告诉您正在尝试执行user.try(:user) == user,这是您所有问题的根源。

所以您可以使用can :manage, :all, :id =&gt; user.id 来解决问题。

【讨论】:

  • 谢谢,这已经阻止了错误的发生。但是,当我注册了一个新用户时,他们仍然被重定向到 /user/:id,而不是重定向中指定的 user/:id/myaccount。知道为什么吗?
  • 如果您删除can :manage代码,重定向是否仍然发生?
  • 如果我去掉 can :manage 块,那么用户将被重定向到根 url,并出现拒绝访问异常。这很奇怪,因为如果我在出现错误屏幕时手动输入 url,它允许访问正确的页面,并且我仍然会得到“成功注册”的闪烁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2012-09-19
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多