2013-09-26 19 views
8

管理者のみがdeviseで用途を追加できるようにしています。しかし、私は管理者としてログインし、エラーで私を追いかけてくれるサインアップフォームを提出すると、今ほとんどはうまくいきました:http://wiki.summercode.com/rails_authentication_with_devise_and_cancanしかし、このような状況には言及していないようです。管理者がDeviseでユーザーを追加できるようにする

これを許可するには、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 

EDIT I:ここで

は私のルート( "編集者" 私のユーザモデルの名前)です私がフォームを提出すると、このProcessing by Devise::RegistrationsController#create as HTMLがログに記録されています。私はおそらくskip_before_filter :require_no_authenticationが呼び出されていないと思われましたが、EditorsControllerRegistrationControllerから継承していたので、フィルタが正しく動作する前のものでした。そうじゃないの?

答えて

6

Devise::RegistrationsControllerからそのアクションを継承するのではなく、メソッドをEditorsControllerに実装するとよいでしょう。あなたが見ているように、Devise::RegistrationsControllerの方法は、あなたがすでにログインしているかどうかを確認し、そうであればあなたを戻します。ログインしていない場合は、Userアカウントを作成し、そのユーザーとしてログインします。

あなたはskip_before_filter :require_no_authenticationでその問題を回避しようとしているが、それはあなたのフォームが/editors代わりの/admin/editorsPOST INGであると考えられます。だから、あなたはあなたがEditorsControllercreateに取得することができますルートを追加する必要があります:

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' 

ユーザーコントローラにこのアクションを追加:その意志を提出するようnew.html.erb 変更のform_for:

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 

ビューデフォルトの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 

するのconfig/routes.rbをにこれを追加します。

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

Userモデルに、このクラスのメソッドを追加します。

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

私は自分のアプリケーション内の別の管理クラスを持っていません。代わりにUsersのadmin属性を定義し、UsersController内の:validate_adminbefore_actionフィルタでそれをチェックしました。

私は:indexビューから新しいユーザを作成できるようにしたかったので、私はボタンを追加しました:

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

あなたはUserモデルのいずれかのafter_createアクションを持っている場合は、上記の溶液を微調整する必要がある場合があります(例えば、ウェルカム電子メールを送信する)。

関連する問題