1

我已经设计并设置了 CanCan,但我试图进入我的 rails 应用程序中的注册页面,但它会将我重定向到主页,说我无权访问此页面。

我有一个自定义注册控制器:

class Devise::RegistrationsController < DeviseController
  before_filter :check_permissions, :only => [:new, :create, :cancel]
  skip_before_filter :require_no_authentication

  def check_permissions
    authorize! :create, resource
  end

  def edit
    @user = User.find(current_user.id)
    @profile = Profile.new

  end 

  def update
    # required for settings form to submit when password is left blank
    if params[:user][:password].blank? && params[:user][:password_confirmation].blank?
        params[:user].delete(:password)
        params[:user].delete(:password_confirmation)
    end

    @user = User.find(current_user.id)
    if @user.update_attributes(params[:user])
      set_flash_message :notice, :updated
      # Sign in the user bypassing validation in case his password changed
      sign_in @user, :bypass => true
      redirect_to after_update_path_for(@user)
    else
      render "edit"
    end

  end

  protected
    def after_update_path_for(resource)
      user_path(resource)
    end

  private

end

它与此有关,before_filter :check_permissions,...因为当我删除此行时,我收到一条错误消息

undefined method `user_registration_path'

从我的“设计/注册#new”中的注册表单:

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>

如何修复我的注册表单?

另外,这是我的路线:

  devise_for :user, :controllers => { :registrations => "registrations" }, :skip => [:registrations, :sessions] do 
    get 'signup' => 'devise/registrations#new', :as => :new_user_registration 
  end
4

1 回答 1

1

好吧,从看起来你所做的事情来看,使用 CanCansauthorize!方法来处理控制器操作中的授权,这将引发 cancan 异常错误。你能不试试做吗

  check_authorization :unless => :devise_controller?

我通过在此处看到的添加 :if 和 :unless 选项到 check_authorization - closes #284的更改来支持这一点。评论可见以下问题:GitHub issue 284。瑞安说:

如果 check_authorization 方法允许块动态自定义行为,那就太好了。如果它返回 true,它将执行授权。

如果我错了,请纠正我,但这不是你想要做的。希望这能带来一些启示。

关于您routes.rb所做的另一件事:

 devise_for :user, :controllers => { :registrations => "registrations" }, :skip => [:registrations, :sessions] do 
    get 'signup' => 'devise/registrations#new', :as => :new_user_registration 
  end

这一切对我来说看起来有点不匹配。您是否有一个devise包含控制器目录中所有设计控制器的文件夹。如果是这样,您是否可以尝试使您的设计路线块如下所示:

  devise_for :users, :controllers => {:sessions => 'devise/sessions', :registrations => 'devise/registrations', :passwords => 'devise/passwords'}, :skip => [:sessions] do
    get '/login' => 'devise/sessions#new', :as => :new_user_session
    get '/register' => 'devise/registrations#new', :as => :registrations
    post '/login' => 'devise/sessions#create', :as => :user_session
    get '/logout' => 'devise/sessions#destroy', :as => :destroy_user_session
  end

更新 从链接GitHub - CheckAuthorization我粘贴在我的评论中,我相信您可以使用check_authorization示例显示的方法:

  class ApplicationController < ActionController::Base
    check_authorization
  end

然后控制器显示您可以:

提供要调用的控制器方法的名称。仅当返回 false 时才会进行授权检查。

     check_authorization :unless => :devise_controller?
于 2013-08-21T14:10:04.380 回答