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