2009-08-06 12 views
1

私がしようとしていることは次のとおりです。ネストされたアトリビュートフォームの子関係の管理

ユーザはいつでもアクティブなプロフィールを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

多分、ユーザーからプロファイルへの2つの関係を試してください。 1つはユーザーインターフェイスで編集できるものと、もう1つは管理者が承認したものです。その後、(多分使用して、観察者またはちょうどと「after_save」フィルタ)管理者のために表示されるでしょうフォームを使用したユーザープロファイルの

class User < AB:B 

has_one :profile #the user-editable one one 
has_one :active_profile, :class_name=>"profile" #the one shown 

end 

各変更:

それは次のように仕事ができます。変更が反映されると、変更はactive_profileにダンプされ、どこかに表示されます。

このようにして、クリーンなフォームインターフェイスを持つことができます。また、再度編集するたびに、最新の(承認されていない)プロファイルが表示されます。また、updated_at列を使用してキューを注文することもできます。「その編集内容はレビューのために未解決のプロファイルに適用され、キューの後ろにプッシュされます」機能を得ることができます。

+0

元々私はこのように考えていましたが、それは理想的ではないと思ったのでそれを却下しましたが、あなたの書き込みはそれを行う正しい方法だと私に確信していました。モデルはよりシンプルです。 – jonnii

+0

私はおそらく、この状況でFKが2つのプロファイルを区別するためにユーザモデル上にある必要があるので、belongs_to not a has_oneであることに言及すべきです。 – jonnii

+0

はい、あなたは正しいです。セマンティクスでは少し怪しいですが、BD関連のものは正しいでしょう。 – Yaraher

1

私は、上記のようにユーザーモデルに2つのプロファイルとの関係を持たせることで、これについて説明します。 1つの「承認済み」プロファイルと編集用のプロファイルが管理キューに表示されます。

しかし、「保留中の」プロファイルと「承認済み」プロファイルの間の遷移を処理するために、移行を処理するために状態マシンを追加する可能性があります。最近のプロジェクトでは、AASMの宝飾品が私にはうってつけです。 (http://github.com/rubyist/aasm/tree/master)、Edge RailsはState Machinageを焼いただけであると思います。あなたはその後、保留User.updateプロファイルを呼び出すことができ

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 

:(http://github.com/rails/rails/commit/aad5a30bf25d8a3167afd685fc91c99f4f09cc57

あなたのモデルは、このような何かを見ることができます!またはUser.updateプロファイルが承認されました。あなたのプロファイル状態を遷移させ、遷移コールバックを使用して、アクティブなプロファイルと保留中のプロファイルの間で編集データを送信することを処理します。

あなたの実際のフォームでnested_attributes_forを使用する限り、私はハックだとは思わないので、ネストされた属性を更新するためにも使用しました。この場合、2つのプロファイル(1つは公開、もう1つは保留中)を持っているので必要ないかもしれません。

ちょっとしたアイデア!ここで大声で考えてみよう!

+0

答えをありがとう。私はステートマシンが詰まっているのを見ました...私は本当にレール3.0を楽しみにしています! – jonnii

関連する問題