2013-09-26 35 views
8

Tôi đang cố gắng làm cho quản trị viên chỉ có thể thêm các công dụng bằng cách nghĩ ra. Tôi đã nhận được nó chủ yếu là làm việc tuy nhiên bây giờ khi tôi đăng nhập như một quản trị viên và gửi mẫu đăng ký nó đá tôi trở lại với lỗi: You are already signed in.Cho phép quản trị viên thêm người dùng với Devise

Tôi đã cố gắng làm theo các hướng dẫn ở đây: http://wiki.summercode.com/rails_authentication_with_devise_and_cancan nhưng nó dường như không đề cập đến tình huống này.

Tôi có cần thực hiện việc ghi đè cao hơn trong số editors_controller để cho phép điều này không?

Dưới đây là tuyến đường của tôi ("biên tập" là tên của mô hình của tôi sử dụng):

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 của tôi trong "app/controllers /"

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 tôi nhận thấy số này Processing by Devise::RegistrationsController#create as HTML trong nhật ký khi tôi gửi biểu mẫu. Tôi đã nghi ngờ rằng có lẽ skip_before_filter :require_no_authentication không được gọi, nhưng giả định rằng vì EditorsController được kế thừa từ RegistrationController trước khi bộ lọc hoạt động đúng cách. đây không phải là trường hợp à?

Trả lời

6

Bạn sẽ muốn triển khai phương pháp create của riêng mình trên EditorsController thay vì kế thừa hành động đó từ Devise::RegistrationsController. Như bạn thấy, phương pháp trong Devise::RegistrationsController trước tiên sẽ kiểm tra xem bạn đã đăng nhập chưa và trả lại cho bạn nếu bạn đang sử dụng. Nếu bạn chưa đăng nhập, nó sẽ tạo một tài khoản User và sau đó đăng nhập bạn với tư cách người dùng đó.

Bạn đang cố gắng khắc phục sự cố đó với skip_before_filter :require_no_authentication, nhưng có khả năng biểu mẫu của bạn là POST nhập vào /editors thay vì /admin/editors. Vì vậy, bạn sẽ cần phải thêm một tuyến đường cho phép bạn để có được create trên EditorsController:

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

Sau đó, bạn muốn thực hiện một phiên bản thu nhỏ của create. Bạn có thể muốn một cái gì đó loại như thế này:

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 

Bạn cũng sẽ muốn chắc chắn rằng admin/editors/new mẫu được chỉ biểu mẫu cho con đường đúng ('admin/editors').

+0

hello Jeremey Tôi đã thử hành động tạo của bạn nhưng nó vẫn bỏ qua biểu mẫu và trả lời tôi bằng thông báo "Bạn đã đăng nhập". bất kỳ ý tưởng? – BKSpurgeon

1

Không có giải pháp googleable nào hoạt động khi tôi thử chúng. Điều này hoạt động

Điều tôi đã làm là tạo một hành động mới trong bộ điều khiển và tuyến mới cho nó và kết nối các liên kết trên các giao diện của tôi mà thường kết nối để tạo bây giờ gọi hành trình và tuyến đường của tôi.

Nhưng điều đó là không đủ. Bởi vì Devise đang lắng nghe và sẽ lấy bất kỳ bổ sung nào bạn cố gắng làm và xác thực nó thông qua mã riêng của nó. Vì vậy, thay vào đó tôi chỉ cần thêm bản ghi người dùng mới với chèn chèn sql.

Thêm tuyến đường này

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

Thêm hành động này với bộ điều khiển sử dụng:

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 

Xem: new.html.erb thay đổi các form_for để nộp chí đi đến tuyến đường và hành động mới, không phải tuyến đường và hành động mặc định.

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

Tôi không thể nhận được giải pháp của bạn để làm việc cho tôi, nhưng nó đã cho tôi một số ý tưởng mà tôi đã có thể sử dụng. Cảm ơn. – guero64

0

Sử dụng Rails 4.2.6 tại đây (mô hình của tôi là Người dùng thay vì Editor). Các đường tránh giải pháp sau đây (tôi nghĩ) bất kỳ đưa ra các hành động có thể ảnh hưởng tạo tài khoản mới của admin:

Thêm hành động này để điều khiển người dùng:

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

Thêm phương pháp tin này đến người dùng điều khiển nếu nó không tồn tại:

private 

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

Thêm phần này vào config/routes.rb:

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

Thêm phương pháp lớp học này với mô hình tài:

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

Tôi không có một lớp quản trị riêng biệt trong ứng dụng của tôi. Thay vào đó, tôi đã xác định thuộc tính quản trị cho Người dùng và kiểm tra thuộc tính đó bằng bộ lọc :validate_adminbefore_action trong UsersController.

tôi muốn để có thể tạo một người dùng mới từ giao diện :index, vì vậy tôi đã thêm một nút:

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

Bạn có thể phải tinh chỉnh các giải pháp trên nếu bạn có bất kỳ after_create hành động trong mô hình tài (ví dụ: gửi email chào mừng).

Các vấn đề liên quan