質問

私は何をしようとしていることは、次のされます:

誰時間で、ユーザは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出願中)を持っているので、この場合は、あなたも必要ではないかもしれないが。

ジャストアイデア!大声でここを考える!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top