복붙노트

[RUBY-ON-RAILS] 유증 여러 "사용자"모델

RUBY-ON-RAILS

유증 여러 "사용자"모델

나는 레일 3.2 유증 2.0을 사용하고 있는데 나는 레일 아주 새로운 해요.

나는 다음을 달성하고 싶습니다 :

검색 좀하고 꽤 오랜 시간에 StackOverflow를 검색,하지만 아무것도 내가 자바 사람, 죄송합니다 :) 지금은 매우 혼란스러워하고있어 해요 (오른쪽 나에게 보인다. 두 솔루션을 내놓았다 :

즉, 가장 흔한 대답. 그냥 기본 유증 사용자를 작성하고 회원 간의 관계를 생성 -> 사용자 및 고객 -> 사용자를. 여기 내 관심사는 내가 각 모델에 대한 사용자 정의 등록 절차를 달성 할 수있는 방법인가? 나는 다른 일을 시도했지만 모두 엉망으로 끝났다!

이것은 사용자 정의 등록 절차를 해결하고, 바로 내 것 같다,하지만 고유의 로그인 폼은 차단입니다. 나는 SO에 대한 답을 발견 (고안 - 두 모델에서 로그인) 고안 :: 모델을 무시할 제안 :: Authenticatable.find_for_authentication (조건). 즉 복잡한 것 같다 (?) 나는 레일에 새로 온 이후로, 나는 그 일을 할 수 있는지 알고 싶습니다?

귀하의 조언을 주셔서 감사합니다!

해결법

  1. ==============================

    1.자바 사람 =)를 타고 오신 것을 환영합니다, 나는 당신이 레일 세계를 즐길 수 있기를 바랍니다. 단순히 문제를 해결하기 위해 당신은이 개 솔루션을 가지고 :

    자바 사람 =)를 타고 오신 것을 환영합니다, 나는 당신이 레일 세계를 즐길 수 있기를 바랍니다. 단순히 문제를 해결하기 위해 당신은이 개 솔루션을 가지고 :

    어느 하나를 선택? 이 역할의 일반적인 속성에 따라 달라집니다. 그들은 거의 일반적인 경우 (예 : 모든 이름, 이메일, 모바일, ...가)와 몇 가지 특성이 다른, 나는 높은 STI 솔루션을 권장합니다.

    어떻게 STI를 할까? 1. 간단히 명령 레일 유증 사용자를 생성하여 유증 사용자 모델과 테이블을 생성 마이그레이션을 사용하여 데이터베이스의 사용자 테이블에 문자열 데이터 유형 열 이름 유형을 추가합니다. (실시 예 g 모델을 관리 레일) 각각의 사용자 타입은 모델을 생성 3. 사용자 모델에서 관리 클래스 상속을 확인하십시오

    class Admin < User
    end
    

    즉) = 작업이 완료 그거야 ... Yupeee

    점은 예를 들어 이메일, 이름에 대한 관리자의 속성 인 명령 Admin.create (...) 실행 관리자를 만들려면 ...

    나는이 질문이 너무 당신을 도울 수 있다고 생각

  2. ==============================

    2.나는 다형성의 역할에 속하는 것이 하나의 사용자 모델로 갔다 접근 방식의 모든 종류를 시도한 후, 당신과 비슷한 신발입니다. 이는 단일 로그인을 달성하는 가장 간단한 방법처럼 보인다.

    나는 다형성의 역할에 속하는 것이 하나의 사용자 모델로 갔다 접근 방식의 모든 종류를 시도한 후, 당신과 비슷한 신발입니다. 이는 단일 로그인을 달성하는 가장 간단한 방법처럼 보인다.

    사용자 모델은 로그인에 단지 정보 특정 포함됩니다.

    역할 모델은 역할에 각 역할에 필드의 특정뿐만 아니라 다른 단체의 특정을 저장하는 것입니다.

    신규 등록은 개별 컨트롤러를 통해 각 사용자 유형 (역할)에 대해 사용자 정의하고 사용자에 대한 중첩 된 속성을 구축 할 것입니다.

    class User < ActiveRecord::Base
        #... devise code ...
        belongs_to :role, :polymorphic => true
    end
    
    class Member < ActiveRecord::Base
        attr_accessible :name, :tel, :city  #etc etc....
        attr_accessible :user_attributes #this is needed for nested attributes assignment
    
        #model specific associations like  
        has_many :resumes
    
        has_one :user, :as => :role, dependent: :destroy
        accepts_nested_attributes_for :user
    end 
    

    경로 - 회원 모델 그냥 평범한 물건.

    resources :members
    #maybe make a new path for New signups, but for now its new_member_path
    

    컨트롤러 - 당신은 중첩 된 속성 build_user에 있습니다

    #controllers/members_controller.rb
    def new
        @member = Member.new
        @member.build_user
    end
    
    def create
        #... standard controller stuff
    end
    

    뷰 / 회원 / new.html.erb

    <h2>Sign up for new members!</h2>
    <%= simple_form_for @member do |f| %>
    
        # user fields
        <%= f.fields_for :user do |u| %>
          <%= u.input :email, :required => true, :autofocus => true %>
          <%= u.input :password, :required => true %>
          <%= u.input :password_confirmation, :required => true %>
        <% end %>
    
        # member fields
        <%= f.input :name %>
        <%= f.input :tel %>
        <%= f.input :city %>
    
        <%= f.button :submit, "Sign up" %>
    <% end %>
    

    나는 중첩 된 형태의 보석 도달 할 필요가 없다는 것을 지적하고 싶습니다; 요구 사항이기 때문에 그 사용자는 역할의 한 유형에 속할 수 있습니다.

  3. ==============================

    3.내가 갈 수있는 방법을 발견하고 나는 지금까지 아주 만족 해요. 나는 다른 사람을 위해 여기를 설명 할 것이다.

    내가 갈 수있는 방법을 발견하고 나는 지금까지 아주 만족 해요. 나는 다른 사람을 위해 여기를 설명 할 것이다.

    나는 하나의 "사용자"클래스와 함께 갔다. 내 문제는 각 의사 모델에 대한 사용자 정의 등록 절차를 달성했다.

    모델 / user.rb :

    class User < ActiveRecord::Base
      devise :confirmable,
           :database_authenticatable,
           :lockable,
           :recoverable,
           :registerable,
           :rememberable,
           :timeoutable,
           :trackable,
           :validatable
    
      # Setup accessible (or protected) attributes for your model
      attr_accessible :email, :password, :password_confirmation, :remember_me, :role
    
      as_enum :role, [:administrator, :client, :member]
      validates_as_enum :role
      ## Rails 4+ for the above two lines
      # enum role: [:administrator, :client, :member]
    
    end
    

    그럼 난 재정의 컨트롤러와 두 개의 등록 경로를 가지고 http://railscasts.com/episodes/217-multistep-forms 및 http://pastie.org/1084054 적응 :

    설정 / routes.rb :

    get  'users/sign_up'   => 'users/registrations#new',        :as => 'new_user_registration'
    
    get  'clients/sign_up' => 'users/registrations#new_client', :as => 'new_client_registration'
    post 'clients/sign_up' => 'users/registrations#create',     :as => 'client_registration'
    
    get  'members/sign_up' => 'users/registrations#new_member', :as => 'new_member_registration'
    post 'members/sign_up' => 'users/registrations#create',     :as => 'member_registration'
    

    컨트롤러 / 사용자 / registrations_controller.rb :

    나는 각 단계에서 유효성을 검사 할 필드를 알고있는 마법사 클래스를 생성

    class Users::RegistrationsController < Devise::RegistrationsController
    
        # GET /resource/sign_up
        def new
            session[:user] ||= { }
            @user = build_resource(session[:user])
            @wizard = ClientRegistrationWizard.new(current_step)
    
            respond_with @user
        end
    
        # GET /clients/sign_up
        def new_client
            session[:user] ||= { }
            session[:user]['role'] = :client
            @user = build_resource(session[:user])
            @wizard = ClientRegistrationWizard.new(current_step)
    
            render 'new_client'
        end
    
        # GET /members/sign_up
        def new_member
          # same
        end
    
        # POST /clients/sign_up
        # POST /members/sign_up
        def create
            session[:user].deep_merge!(params[:user]) if params[:user]
            @user = build_resource(session[:user])
            @wizard = ClientRegistrationWizard.new(current_step)
    
            if params[:previous_button]
                @wizard.previous
            elsif @user.valid?(@wizard)
                if @wizard.last_step?
                    @user.save if @user.valid?
                else
                    @wizard.next
                end
            end
    
            session[:registration_current_step] = @wizard.current_step
    
            if @user.new_record?
                clean_up_passwords @user
                render 'new_client'
            else
                #session[:registration_current_step] = nil
                session[:user_params] = nil
    
                if @user.active_for_authentication?
                    set_flash_message :notice, :signed_up if is_navigational_format?
                    sign_in(:user, @user)
                    respond_with @user, :location => after_sign_up_path_for(@user)
                else
                    set_flash_message :notice, :"signed_up_but_#{@user.inactive_message}" if is_navigational_format?
                    expire_session_data_after_sign_in!
                    respond_with @user, :location => after_inactive_sign_up_path_for(@user)
                end
            end
    
        end
    
        private
    
        def current_step
            if params[:wizard] && params[:wizard][:current_step]
                return params[:wizard][:current_step]
            end
            return session[:registration_current_step]
        end
    
    end
    

    내 의견은 다음과 같습니다 :

  4. ==============================

    4.그래서 잘못은 무엇인가? 그냥 실행 레일 g 유증 :보기 [MODEL_NAME, 각각의 등록 양식을 사용자 정의의 설정 / 초기화 / devise.rb 단지 넣어 config.scoped_views = 사실.

    그래서 잘못은 무엇인가? 그냥 실행 레일 g 유증 :보기 [MODEL_NAME, 각각의 등록 양식을 사용자 정의의 설정 / 초기화 / devise.rb 단지 넣어 config.scoped_views = 사실.

  5. from https://stackoverflow.com/questions/9472852/devise-and-multiple-user-models by cc-by-sa and MIT license