ネストされた属性フォームと子の関係を管理します
-
11-09-2019 - |
質問
私は何をしようとしていることは、次のされます:
誰時間で、ユーザは1つのアクティブなプロファイルを持つことができます。このアクティブなプロファイルは、サイトの規則や規制に準拠していることを確認するために、管理者によって承認されなければなりません。ユーザーは自分のプロフィールを編集する場合、管理者がその変更をオフに署名するまで、自分のパブリックプロファイルは影響を受けません。プロフィールがレビューしている間、彼らは編集を行う場合は、その編集はレビューのために優れたプロファイルに適用され、キューの後ろにプッシュされます。
私のモデルは次のようになります:
class Profile < AR:B
belongs_to :user
end
class User < AR:B
has_many :profiles do
def active
...
end
def latest
end
end
def profile
self.profiles.active
end
end
一つの小さなねじれがあります...プロファイルのコレクションが公開されていないように、ユーザーは、直接プロファイルを編集することはできないはずです。代わりに、彼らは彼らのユーザーを編集して、プロファイルのフィールドが表示されます。
これを管理するための最良の方法は何ですか?現在、私は使用しています:
accepts_nested_attributes_for :profiles
ユーザーには、それはかなりハックようです。理想的には、このロジックのほとんどは、モデルに住んでいるだろうが、私はといちゃつくてる他の事は、プレゼンターの使用である。
の任意の考えをいただければ幸いです、あなたがコメントとしてより多くの情報が必要な場合は私に知らせて、私はこのポストを適切に更新します。
解決
たぶん、あなたは、プロファイルへのユーザーからの2体の関係を持ってみてください。一つは、彼らがあなたのユーザインタフェースを介して編集することができるものであり、その他は、管理者によって承認されたものです。
これは次のように仕事ができます
class User < AB:B
has_one :profile #the user-editable one one
has_one :active_profile, :class_name=>"profile" #the one shown
end
フォームを使用したユーザープロファイルの各変更は、[管理(使用して、観察者または多分ちょうどと「after_save」フィルタ)のために表示されるでしょう。それをaprovesすると、変更内容は、その後active_profile 1にダンプし、どこかに表示されます。
その方法は、あなたがきれいなフォームインタフェースを持つことができ、彼らは再びそれを編集するたびに、彼らは最新(ただし、承認されていない)のプロファイルを参照してください。また、「彼らの編集がレビューのために優れたプロファイルに適用され、キューの後ろにプッシュされた」funcionalityを得るためにupdated_atの列を使用してキューを注文することができます。
他のヒント
私も上に示唆したように、2つのプロファイルと関係を持っているユーザーのモデルを持っていることによって、このついて行くと思います。一つは、プロファイル、およびお使いの管理キューに入り、編集のための1つを「承認しました」。
ただし、「保留」プロファイルと「承認」のプロファイル間の遷移を処理するために、私は遷移を処理するために、ステートマシンに追加する可能性をお勧めしたいです。 AASM宝石は最近のプロジェクトで私のために良いされています。 ( http://github.com/rubyist/aasm/tree/master の)そして私は、Edge Railsは同様にちょうど焼き州Machinage権を持っていると信じています。 ( http://github.com/rails/rails/commit/aad5a30bf25d8a3167afd685fc91c99f4f09cc57する)
あなたのモデルは、このような何かを見ることができます
class User < AR:B
has_one :active_profile
has_one :pending_profile
include ActiveRecord:: StateMachine
state_machine do
state :approved
state :pending
state :rejected
event :update_profile_pending do
transitions :to => :pending, :from => [:approved], :on_transition => :send_to_admin_queue
end
event :update_profile_approved do
transitions :to => :approved, :from => [:pending], :on_transition => :update_current_profile
end
event :update_to_rejected do
transitions :to => :rejected, :from => [:pending]
end
end
def send_to_admin_queue
//method to handlesending pending profiles to admin for approval
end
def update_current_profile
//method to handle updated profiles with changes
end
end
これで、保留中のUser.updateプロファイルを呼び出すことができます!またはUser.updateプロファイルは、承認されました!プロフィールの状態間の遷移とあなたのアクティブなプロファイルと保留中のプロファイルの間で編集データの送信を処理するために遷移コールバックを使用します。
限り、あなたの実際のフォームでnested_attributes_forを使用して、私はそれはハックだとは思わない、私は、ネストされた属性を更新するだけでなく、それを使ってきたし、それが正常に動作と思います。あなたが2つのプロファイル(1公共、1出願中)を持っているので、この場合は、あなたも必要ではないかもしれないが。
ジャストアイデア!大声でここを考える!