1

クラスの単一表継承先生、生徒、外部者のタイプにできる人。単一テーブル継承の場合のフォームヘルパー

class Person < ActiveRecord::Base 

end 


class Teacher < Person 

end 

class Student < Person 

end 

class Outsider < Person 

end 

新しいユーザーを登録するときに、ルートとフォームにどのような変更を加える必要がありますか。私は、新しいユーザーを登録するためのフォームのドロップダウンとして実装することができる人のテーブルに列(文字列) "タイプ"を持っています。ユーザーが特定のタイプのPersonとして登録されるように、フォームで行う必要があるものはありますか?ルートの変更も必要ですか?

答えて

1

フォームにタイプ選択のドロップダウンリストを追加する以外は、これ以上何もしません。あなたは次のように、通常の方法でユーザーを作成することができます

@user = Person.new params[:user] 

しかしtype属性は、質量割り当てることができなかったので、あなたは別にそれを割り当てる必要があります。

@user.type = sanitize_user_type params[:user][:type] 

ユーザ入力値を検証するために使用されるsanitize_user_type方法。

新しいユーザーを作成するためのルートは変更する必要はありません。他のルートを変更する必要があるかどうかは、要件に依存しません。実際にはTeacherStudentOutsider、および関連コントローラのルートを追加することができますので、安らかなURLを構築できます。

2

すべてのタイプのPersonを作成するために1つのフォームを使用するので、追加のルートを追加する必要はありませんので、1つのコントローラも使用する必要があります。

type属性は実際に手動でインスタンスに割り当てる必要はありません。作成するモデルの種類を選択することによって自動的に設定する必要があります。

それはあなたのコントローラやビューでどのように見えるか、私は知りませんが、あなたはこのように作成するモデルのタイプを抽出することができます。

一方
class_type = params[:type].constantize 
@person = class_type.new 

、type属性が中にネストされている場合あなたのビューでform_forを使うと、type属性はおそらくparams [:person] [:type]のようなコントローラーに送られます。この場合、新しいインスタンスを作成する前に:personハッシュから削除する必要があります。おそらく次のようなものでしょう:

class_type = params[:person].delete(:type).constantize 
@person = class_type.new(params[:person]) 
関連する問題