سؤال

ما أحاول القيام به هو ما يلي:

في أي وقت يمكن للمستخدم الحصول على 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

في المستخدم، ولكن هذا يبدو هوكي تماما. من الناحية المثالية، سيعيش معظم هذا المنطق في النموذج، لكن الشيء الآخر الذي يمزحه هو استخدام مقدم عرض.

أي أفكار ستكون موضع تقدير كبير، اسمحوا لي أن أعرف إذا كنت بحاجة إلى مزيد من المعلومات كتعليق وسأقوم بتحديث هذا المنصب بشكل مناسب.

هل كانت مفيدة؟

المحلول

ربما يجب أن تحاول وجود علاقاتتين من المستخدم إلى الملف الشخصي. واحد هو الشخص الذي يمكنهم تعديله من خلال واجهة المستخدم الخاصة بك، والآخر هو الذي تمت الموافقة عليه من قبل المسؤول.

يمكن أن تعمل شيء مثل:

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"). عندما يتم إلقاء ذلك، يتم إلقاء التغييرات بعد ذلك إلى Active_Profile One، وأظهرت في مكان ما.

بهذه الطريقة، يمكنك الحصول على واجهة نموذج نظيفة، وعندما تقوم بتحريرها مرة أخرى، يرون أحدث ملف تعريف (ولكن غير معتمد). يمكنك أيضا طلب قائمة الانتظار باستخدام العمود المحدثة لكسب "تعديلاتهم يتم تطبيقها على ملف التعريف المتميز للمراجعة ويتم دفعها إلى الجزء الخلفي من Funcionality".

نصائح أخرى

سأذهب حول هذا من خلال وجود نموذج المستخدم لديك علاقة مع اثنين من الملفات الشخصية كما هو مقترح أعلاه كذلك. ملف تعريف "معتمد" واحد، والآخر للتحرير الذي يدخل في قائمة انتظار المسؤول الخاص بك.

ومع ذلك، من أجل التعامل مع التحولات بين ملفات التعريف "المعلقة" وملفات التعريف "المعتمدة"، أود أن أضيفت في آلة الحالة للتعامل مع التحولات. كانت جوهرة AASM جيدة بالنسبة لي في مشروع حديث. فيhttp://github.com/roubyist/aash/tree/master.)، وأعتقد أن قضبان الحافة لديها ماكينة الدولة المخبوزة بشكل صحيح أيضا. في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 ملفات شخصية (جمهور واحد، معلقة واحدة).

مجرد فكرة! التفكير بصوت عال هنا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top