Ruby on Rails:未授权访问注册页面?

时间:2013-08-21 14:00:16

标签: ruby-on-rails ruby-on-rails-3 devise cancan

我已经设计好了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

1 个答案:

答案 0 :(得分:1)

好的,看起来你已经完成的是使用CanCans authorize!方法来处理控制器动作中的授权,这将引发cancan异常错误。你能不能尝试做到

  check_authorization :unless => :devise_controller?

我通过在此处adding :if and :unless options to check_authorization - closes #284进行了一次cancan提交的更改来支持这一点。评论可以在以下问题中看到: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?