2016-05-20 22 views
1

「Devise User」と「Influencer」という2つのモデルがあります。影響者はユーザーであるため、ユーザー(dbの観点から)が必要です。ユーザーは複数のことができます。したがって、私たちはインフルエンサーでなくてもユーザーにサインアップできるようにしたいので、インフルエンサーとしてサインアップするときにユーザーにサインアップしたいと考えています。異なるフォームとコントローラからDeviseユーザを作成する - Ruby on Rails

私はそうのような形式があります。それは、レンダリングすることができるように私たちは、ApplicationHelperと '新しい' 方法を変更した

influencers/new.html.erb

<%= form_for @influencer do |i| %> 
    <%= i.fields_for(resource, as: resource_name, url: registration_path(resource_name)) do |u| %> 
    <div id="registration_fields"> 
     <%= render 'devise/registrations/registration_fields', f: u %> 
    </div> 
    <% end %> 

<div class='field'> 
    <%= i.label :twitter_handle %><br/> 
    <%= i.text_field :twitter_handle %> 
</div> 

<div class='field'> 
    <%= i.label :short_bio %><br/> 
    <%= i.text_area :short_bio %> 
</div> 

/views/devise/registrations/_registration_fields

<%= devise_error_messages! %> 

<div class="field"> 
    <%= f.label :first_name %> <br /> 
    <%= f.text_field :first_name %> 
</div> 

<div class="field"> 
    <%= f.label :last_name %> <br /> 
    <%= f.text_field :last_name %> 
</div> 

<div class="field"> 
    <%= f.label :email %><br /> 
    <%= f.email_field :email, autofocus: true %> 
</div> 
<div class="field"> 
    <%= f.label :password %> 
    <% if @minimum_password_length %> 
    <em>(<%= @minimum_password_length %> characters minimum)</em> 
    <% end %><br /> 
    <%= f.password_field :password, autocomplete: "off" %> 
</div> 

<div class="field"> 
    <%= f.label :password_confirmation %><br /> 
    <%= f.password_field :password_confirmation, autocomplete: "off" %> 
</div> 

をこのDeviseフォームは問題なし。残念ながら、私たちは、InfluencersControllerのための「作成」メソッドを適切に作成する方法について固執しています。

これは、我々が受け取るハッシュです:

Parameters: {..., "influencer"=>{"user"=>{"first_name"=>"buddy", "last_name"=>"king", "email"=>"[email protected]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "twitter_handle"=>"@bdking", "short_bio"=>"None"}, "commit"=>"Join as influencer" 

基本的に、我々は我々がインフルエンサーの情報を処理しながら、ユーザー情報を処理するために考案したいです。 InfluencersController#create内からDevise :: RegistrationsController.new.createメソッドを呼び出すことを試みました。しかし、これは(@responseが見つからない、または 'response.env'が見つからない、または 'devise.mappings'が見つからないなどのさまざまな問題に遭遇したとしても)難しい問題です。

私たちは継承することで、作成機能で「スーパー」と呼ぶことができます。しかし、私たちはInfluencersControllerにDevise :: RegistrationsControllerを継承させたくありません。なぜなら、このコントローラは真のDeviseコントローラではないからです。

これを回避する方法はありますか?

答えて

0

私は、usersrolesの試して真のパターンを使用します。

基本的には、Userクラスは認証(ID)を担当し、ユーザーには承認(権限)に使用できるRolesが多数あります。

class User < ActiveRecord::Base 
    has_many :roles 

    def has_role?(role) 
    roles.where(name: role) 
    end 
end 

class Role < ActiveRecord::Base 
    belongs_to :user 
    validates_uniqueness_of :name, scope: :user_id 
end 

「インフルエンサー」は実際には役割(名前:「インフルエンサー」)が付いたユーザーです。本当の力と柔軟性は、Web GUIからのロールの付与/取り消しを実装することを自明にしていることです。

あなたはDevise/Wardenが本当に乱雑になる可能性のある複数のクラスをサポートするために認証を処理する方法を使いこなす必要はありません。

最高の部分は、Rolify gemは設定が非常に簡単です。あなたはSTIやMTIを使用することができますし、あなたが絶対に持っている場合は

class InfluencerRegistrationsController < Devise::RegistrationsController 

    def resource_class 
    User 
    end 

    def build_resource 
    super 
    self.resource.roles.new(name: :influencer) 
    end 
end 
+0

セットアップに必要な場合は特定のエンドポイント(influences/registrations)は、「インフルエンサー」あなたは、単に工夫コントローラでbuild_resourceメソッドをオーバーライドすることができます登録します。しかし、コンプは、複雑さとパフォーマンスの点でかなり巨大です。 – max

+0

STIまたはMTIとは何ですか?そしてあなたが正しいです、私たちは、そのうちの1人がインフルエンサーであるユーザ役割を使用しています。しかし、インフルエンサーは余分なデータ・メンバーを持っているため、独自の表を作成します。 InfluencersControllerにDevise :: RegistrationsControllerから継承せずにユーザーを登録させる方法があるかどうかを尋ねています。 –

+0

単一テーブルの継承と複数テーブルの継承はい、リダイレクトする前にセッションにIDを格納するように 'sign_in @ user'を呼び出す点を除いて、他のCRUDコントローラーと大きく異なるわけではなく、ユーザーを登録するコントローラーを最初から作成することができます。 – max

関連する問題