2013-09-26 229 views
8

我试图让它只有管理员可以添加用途与设计。我已经得到它主要工作,但现在当我作为管理员登录,并提交注册形式它踢我回来的错误:You are already signed in.允许管理员添加用户与设计

我试图按照这里的说明:http://wiki.summercode.com/rails_authentication_with_devise_and_cancan但它似乎没有提到这种情况。

我是否需要在editors_controller中进一步覆盖以允许这样做?

这里是我的路线( “编辑” 我的用户模型的名称):

devise_for :admins, :skip => [:registrations] 

as :admin do 
    get 'admin/editors'  => 'editors#index',     as: :admin_editors 
    get 'admin/editors/new' => 'editors#new',     as: :new_editor 
    delete 'admin/editors/:id' => 'editors#destroy',    as: :destroy_editor 
end 


devise_for :editors, :skip => [:registrations], :controllers => { :registrations => "editors" } 

和我editors_controller “应用程序/控制器/”

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

    def dashboard 
    render "editors/dashboard.html.haml" 
    end 

    def index 
    @editors = Editor.all 
    respond_to do |format| 
     format.html 
    end 
    end 

    private 
    def check_permissions 
     authorize! :create, resource 
    end 
end 

编辑 我我在提交表单时在日志中注意到这个Processing by Devise::RegistrationsController#create as HTML。我曾怀疑可能是skip_before_filter :require_no_authentication没有被调用,但假设因为EditorsControllerRegistrationController继承过滤器将正常工作之前。情况并非如此吗?

回答

6

您需要在EditorsController上实施自己的create方法,而不是从Devise::RegistrationsController继承该操作。正如你所看到的,Devise::RegistrationsController中的方法将首先检查你是否已经登录,如果你是的话,你会回来。如果您未登录,它将创建一个User帐户,然后以该用户的身份登录。

你试图避开这一问题skip_before_filter :require_no_authentication,但很可能是你的表格是POST荷兰国际集团以/editors而不是/admin/editors。所以,你需要添加一个路线,让你去createEditorsController

as :admin do 
    post 'admin/editors' => 'editors#create' 
    # your other :admin routes here 
end 

然后,你要实现的create缩小版。你可能想有点像这样:

class EditorsController < Devise::RegistrationsController 
    def create 
    build_resource(sign_up_params) 
    if resource.save 
     redirect_to admin_editors_path 
    else 
     clean_up_passwords resource 
     respond_with resource 
    end 
    end 

    # your other methods here 
end 

你还需要确保在admin/editors/new模板指向的形式向正确的路由('admin/editors')。

+0

hello Jeremey我已经尝试过你的创建动作,但它仍然绕过表单,并用“你已经登录”的信息舔我。有任何想法吗? – BKSpurgeon

1

没有任何googleable解决方案工作时,我尝试了他们。这工作

我所做的是在控制器中创建一个新的动作,并为它创建一个新的路由,并连接我的视图上的链接,这些链接通常连接到创建,现在调用我的路由和操作。

但这还不够。因为Devise正在监听并且会抓取任何你想做的添加,并通过它自己的代码进行验证。所以相反,我只是用sql插入添加新的用户记录。

添加这条路线

post 'savenew', to: 'users#savenew' 

这个动作添加到用户控制器:

def savenew 
    rawsql = "insert into users (email, created_at,updated_at) values ('#{user_params[:email]}',now(), now())" 
    sql = rawsql 
    ActiveRecord::Base.connection.execute(sql) 
    redirect_to action: 'index'' 
end 

查看:new.html.erb 变化的form_for使提交的意志去新的路线和行动,而不是默认的Rails之一。

<%= form_for User, :url => {:action => "savenew"} do |f| %> 
+0

我无法让你的解决方案为我工作,但它给了我一些我可以使用的想法。谢谢。 – guero64

0

在这里使用Rails 4.2.6(我的模型是用户而不是编辑器)。下面的解决方案旁路(我认为)的任何设计可以由管理员用新的用户创建干涉行动:

加入这一行动给用户控制器:

def savenew 
    User.create_new_user(user_params) 
    redirect_to action: 'index' 
end 

添加这种私有方法的用户控制器,如果它不存在:

private 

def user_params 
    params.require(:user).permit(:email, :password,  
           :password_confirmation) 
end 

一下添加到配置/ routes.rb中:

match '/savenew', to: 'users#savenew', via: :post 

添加此类方法将用户模式:

def self.create_new_user(params) 
    @user = User.create!(params) 
end 

我没有在我的应用程序单独管理类。相反,我为用户定义了一个管理员属性,并使用UsersController中的:validate_adminbefore_action筛选器进行检查。

我希望能够创建一个从:index视图的新用户,所以我增加了一个按钮:

<%= button_to 'New User', '/new_user', class: 'btn btn-primary', 
          method: :get %> 

您可能需要调整上述方案,如果你有在用户模型中的任何after_create行动(例如发送欢迎电子邮件)。

相关问题