복붙노트

[RUBY-ON-RAILS] 루비 온 레일 및 유증에 여러 사용자 모델은 별도의 등록 경로하지만 하나 개의 공통 로그인 경로가합니다

RUBY-ON-RAILS

루비 온 레일 및 유증에 여러 사용자 모델은 별도의 등록 경로하지만 하나 개의 공통 로그인 경로가합니다

첫째, 나는 구글과 야후와 강렬 검색 한 나는 내 같은 주제에 대한 몇 가지 대답을 발견했지만, 그들은 모두 내가 정말 알아야 할 사항에는 적용되지 않습니다.

나는 디자이너, 소매, 지금은 그것의 고객, 내 응용 프로그램에서 여러 사용자 모델을 가지고 있으며 와서 아직 더있다 보인다. 그들은 모두 사이트에 자신의 테이블과 여러 분야에 저장된 다른 데이터가 허용하거나하지 않을 수 있습니다. 나는 다음과 같은 모델 설정을 가지고 있도록 고안 + 캉캉 길을 가야하고, 다형성 협회 내 행운을 시도 생각 그래서 :

class User < AR
  belongs_to :loginable, :polymorphic => true
end

class Customer < AR
  has_one :user, :as => :loginable
end

class Designer < AR
  has_one :user, :as => :loginable
end

class Retailer < AR
  has_one :user, :as => :loginable
end

등록을 위해 나는 각각의 서로 다른 사용자 유형에 대한 사용자 의견을 가지고 내 노선이 같은 설정은 다음과 같습니다

devise_for :customers, :class_name => 'User'
devise_for :designers, :class_name => 'User'
devise_for :retailers, :class_name => 'User'

내가 아니라이 동작을 사용자 정의해야 할 것이다 다른 모델의 가게에 다른 데이터를 가지고 있기 때문에 지금은 등록 컨트롤러 ( "유증 / 등록"인) 기준으로 왼쪽, 그러나 나는 생각한다!?

하지만이 설정에 나는 customer_signed_in 같은 헬퍼있어? 및 designer_signed_in?하지만 난 필요 정말 거라고 무엇 user_signed_in 같은 일반적인 도우미는? 모든 사용자가 액세스 할 수있는 위치에 상관없이 사용자 유형에있는 지역.

나는 경로 대신 * 유형 * _session_path 등 여러 new_의 new_user_session_path 같은 도우미도하고 싶습니다. 사실 나는 다른 할 필요가 모든 등록 절차는 ...

그래서 나는이 문제에 대한 IF THIS IS 방식 GO 궁금 ??? 또는 이것에 대한 더 나은 / 쉽게 / 덜 반드시 사용자 정의 솔루션이있다 ???

미리 감사드립니다, 로버트

해결법

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

    1.좋아, 그래서를 통해 일을 다음과 같은 솔루션에왔다. 나는 조금 궁리 costumize 필요가 있지만 복잡 아니에요.

    좋아, 그래서를 통해 일을 다음과 같은 솔루션에왔다. 나는 조금 궁리 costumize 필요가 있지만 복잡 아니에요.

    사용자 모델

    # user.rb
    class User < ActiveRecord::Base
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :trackable, :validatable
    
      attr_accessible :email, :password, :password_confirmation, :remember_me
    
      belongs_to :rolable, :polymorphic => true
    end
    

    고객 모델

    # customer.rb
    class Customer < ActiveRecord::Base
      has_one :user, :as => :rolable
    end
    

    디자이너 모델

    # designer.rb
    class Designer < ActiveRecord::Base
      has_one :user, :as => :rolable
    end
    

    사용자 모델은 간단한의 다형성 연관이있다 그래서 그것이 고객 또는 디자이너의 경우, 정의. 내가해야 할 일을했을 다음 일은 레일 g 유증와 유증 뷰를 생성했다 :보기 내 응용 프로그램의 일부가 될 수 있습니다. 난 단지 사용자 정의 할 수있는 등록을 필요로하기 때문에 나는 앱 / 뷰 / 궁리 / 등록은 폴더를 유지하고 나머지는 제거.

    그럼이 등록 앱에서 찾을 수 있습니다 새로운 등록,보기 정의 / 뷰 / 궁리 / 등록 / new.html.erb 당신이 그들을 생성 후.

    <h2>Sign up</h2>
    
    <%
      # customized code begin
    
      params[:user][:user_type] ||= 'customer'
    
      if ["customer", "designer"].include? params[:user][:user_type].downcase
        child_class_name = params[:user][:user_type].downcase.camelize
        user_type = params[:user][:user_type].downcase
      else
        child_class_name = "Customer"
        user_type = "customer"
      end
    
      resource.rolable = child_class_name.constantize.new if resource.rolable.nil?
    
      # customized code end
    %>
    
    <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
      <%= my_devise_error_messages!    # customized code %>
    
      <div><%= f.label :email %><br />
      <%= f.email_field :email %></div>
    
      <div><%= f.label :password %><br />
      <%= f.password_field :password %></div>
    
      <div><%= f.label :password_confirmation %><br />
      <%= f.password_field :password_confirmation %></div>
    
      <% # customized code begin %>
      <%= fields_for resource.rolable do |rf| %>
        <% render :partial => "#{child_class_name.underscore}_fields", :locals => { :f => rf } %>
      <% end %>
    
      <%= hidden_field :user, :user_type, :value => user_type %>
      <% # customized code end %>
    
      <div><%= f.submit "Sign up" %></div>
    <% end %>
    
    <%= render :partial => "devise/shared/links" %>
    

    각 사용자에 대해 내가 특정 사용자 유형에 대한 사용자 정의 필드, 즉 디자이너와 별도의 부분 생성 입력 -> _designer_fields.html

    <div><%= f.label :label_name %><br />
    <%= f.text_field :label_name %></div>
    

    그럼 설치는 유증의 노선들은 등록에 사용자 정의 컨트롤러를 사용하는

    devise_for :users, :controllers => { :registrations => 'UserRegistrations' }
    

    그럼 난이 고안 :: RegistrationsController의 방법을 만들에서 원본 소스 코드를 복사, 사용자 정의 등록 절차를 처리하는 컨트롤러를 생성에, 해당 폴더에보기 파일을 이동하는 것을 잊지 마세요 내 방식 (작동하도록 수정 내 경우 응용 프로그램 / 뷰 / user_registrations

    class UserRegistrationsController < Devise::RegistrationsController
      def create
        build_resource
    
        # customized code begin
    
        # crate a new child instance depending on the given user type
        child_class = params[:user][:user_type].camelize.constantize
        resource.rolable = child_class.new(params[child_class.to_s.underscore.to_sym])
    
        # first check if child instance is valid
        # cause if so and the parent instance is valid as well
        # it's all being saved at once
        valid = resource.valid?
        valid = resource.rolable.valid? && valid
    
        # customized code end
    
        if valid && resource.save    # customized code
          if resource.active_for_authentication?
            set_flash_message :notice, :signed_up if is_navigational_format?
            sign_in(resource_name, resource)
            respond_with resource, :location => redirect_location(resource_name, resource)
          else
            set_flash_message :notice, :inactive_signed_up, :reason => inactive_reason(resource) if is_navigational_format?
            expire_session_data_after_sign_in!
            respond_with resource, :location => after_inactive_sign_up_path_for(resource)
          end
        else
          clean_up_passwords(resource)
          respond_with_navigational(resource) { render_with_scope :new }
        end
      end
    end
    

    이것이 모두 기본적으로하는 일은 사용자 유형은 컨트롤러의 전달 년대 USER_TYPE 매개 변수에 따라 작성해야합니다 컨트롤러를 결정 URL에 간단한의 GET-PARAM하여 매개 변수를 사용하여 뷰에 숨겨진 필드에 의한 방법을 만들 것입니다.

    예를 들면 : 당신은 / sign_up? 사용자 / 사용자 [USER_TYPE] = 디자이너 당신은 디자이너를 만들 수 있습니다로 이동합니다. 당신은 / sign_up? 사용자 / 사용자 [USER_TYPE] = 고객이 고객을 만들 수 있습니다로 이동합니다.

    my_devise_error_messages! 방법은 원래 devise_error_messages에 따라도 연관 모델에서 유효성 검사 오류를 처리하는 도우미 메서드입니다! 방법

    module ApplicationHelper
      def my_devise_error_messages!
        return "" if resource.errors.empty? && resource.rolable.errors.empty?
    
        messages = rolable_messages = ""
    
        if !resource.errors.empty?
          messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
        end
    
        if !resource.rolable.errors.empty?
          rolable_messages = resource.rolable.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
        end
    
        messages = messages + rolable_messages   
        sentence = I18n.t("errors.messages.not_saved",
                          :count => resource.errors.count + resource.rolable.errors.count,
                          :resource => resource.class.model_name.human.downcase)
    
        html = <<-HTML
        <div id="error_explanation">
        <h2>#{sentence}</h2>
        <ul>#{messages}</ul>
        </div>
        HTML
    
        html.html_safe
      end
    end
    

    최신 정보:

    / 디자이너 / sign_up 및 / 고객 등의 지원 경로를 할 수 있도록 / 당신은 당신의 루트 파일에 다음과 같은 작업을 수행 할 수 sign_up :

    # routes.rb
    match 'designer/sign_up' => 'user_registrations#new', :user => { :user_type => 'designer' }
    match 'customer/sign_up' => 'user_registrations#new', :user => { :user_type => 'customer' }
    

    경로에서 사용되지 상관 없음 매개 변수는 내부적으로 PARAMS 해시에 전달되는 구문. 그래서 : 사용자가 PARAMS 해시에 전달됩니다.

    그래서 ... 그것 뿐이다. 조금 여기 저기 tweeking와 함께 나는 그것이 일반적인 사용자 테이블을 공유하는 다른 많은 사용자 모델과 쉽게 확장의 아주 일반적인 방법에서 작업 할 얻었다.

    희망 누군가가 유용 찾습니다.

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

    2.난 그냥 여기에 쓸거야 그래서 나는 허용 대답 주석의 방법을 찾아 관리하지 않았다.

    난 그냥 여기에 쓸거야 그래서 나는 허용 대답 주석의 방법을 찾아 관리하지 않았다.

    이 날짜가 아마 때문에, 허용 대답 상태로 정확하게 작동하지 않는 몇 가지가 있습니다.

    어쨌든, 나 자신에서 일해야하는 몇 가지 :

    대신 단순히 build_resource. 변경되지 않고 일부 대량 할당 오류가 다가오고 있었다.

    클래스와 ApplicationController

      # Overriding the Devise current_user method
      alias_method :devise_current_user, :current_user
      def current_user
        # It will now return either a Company or a Customer, instead of the plain User.
        super.rolable
      end
    end
    

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

    3.나는 위의 지침에 따라 약간의 차이를 발견하고 그것을 구현되었을 때 그 명령은 유효 기간이 있었다되었다.

    나는 위의 지침에 따라 약간의 차이를 발견하고 그것을 구현되었을 때 그 명령은 유효 기간이 있었다되었다.

    그래서 하루 종일 그것과 사투를 벌인 후, 나를 위해 일한 것을 내가 당신과 함께 공유 할 수 - 잘하면 그것은 당신에게 땀과 눈물의 몇 시간을 절약 할 수

    사람 당신에게 몇 시간을 절약 할 수 있기를 바랍니다.

  4. from https://stackoverflow.com/questions/7299618/multiple-user-models-with-ruby-on-rails-and-devise-to-have-separate-registration by cc-by-sa and MIT license