8

Tôi đang sử dụng đường ray 3.0.9 và đặt ra để xác thực. Bây giờ tôi đang cố gắng sử dụng thừa kế bảng đơn vì tôi cần sử dụng đa hình, vì vậy tôi có hai lớp: UserType1 và UserType2, kế thừa từ lớp User. Tôi cần rằng Devise dụ một cách chính xác current_user tùy thuộc vào loại người dùng.đưa ra: ví dụ current_user sử dụng thừa kế bảng đơn

Ví dụ,

class User < ActiveRecord::Base 
#devise and other user logic 
end 

class UserType1 < User 
    def get_some_attribute 
    return "Hello, my type is UserType1" 
    end 
end 

class UserType2 < User 
    def get_some_attribute 
    return "Hello, my type is UserType2" 
    end 
end 

In controller 

class MyController < ApplicationController 
    def action 
    @message = current_user.get_some_attribute #depending the type using polymorphism 
    render :my_view 
    end 
end 
+0

Tôi cũng gặp vấn đề tương tự – maxiperez

+0

Bạn đã thêm cột 'loại' vào bảng người dùng chưa? Đây là những gì làm cho Rails STI hoạt động. – Salil

+0

Quên tiền thưởng của tôi, 'current_user' được khởi tạo nhanh. –

Trả lời

4

đó là chính xác những gì bạn cần: http://blog.jeffsaracco.com/ruby-on-rails-polymorphic-user-model-with-devise-authentication

bạn cần phải ghi đè lên các dấu hiệu trong phương pháp đường dẫn trong bộ điều khiển ứng dụng của bạn, hy vọng nó giúp.

+0

Xin lỗi, như tôi đã nói trong bình luận + câu trả lời, quên tiền thưởng của tôi, 'current_user' là trong thực tế cũng instantiated bởi cơ chế STI. Tôi đặt tiền thưởng quá nhanh mà không cần thử nghiệm cho đến nay;) –

+0

không có vấn đề gì, tôi chỉ cố gắng giúp :) – rbinsztock

+0

Liên kết đã chết :-( –

1

Bạn sẽ cần phải thêm get_some_attribute phương pháp bên User mô hình

Module User < ActiveRecord::Base 

    #devise and other user logic 

    def get_some_attribute 
     #You can put shared logic between the two users type here 
    end 

end 

sau đó, để ghi đè lên nó trong các loại sử dụng phụ, như thế này:

Module UserType1 < User 

    def get_some_attribute 
     super 
     return "Hello, my type is UserType1" 
    end 

end 

Module UserType2 < User 

    def get_some_attribute 
     super 
     return "Hello, my type is UserType2" 
    end 

end 

Sau đó, current_user.get_some_attribute sẽ làm việc như bạn mong đợi , nếu bạn muốn đọc thêm về phương pháp ghi đè trong Ruby, bạn có thể đọc về nó here

Tôi đã thêm super vì tôi giả định rằng bạn có một số logic được chia sẻ trong get_some_attribute, vì nó sẽ gọi get_some_attribute trong Mô hình người dùng, bạn có thể xóa nó nếu bạn không cần nó.

Chúc may mắn!

+0

Tôi khuyên bạn chỉ sử dụng một loại người dùng và phụ thuộc vào vai trò để xác định xem phải làm gì .. – simo

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