القضبان: كيف تتعامل مع بعض مجالات المعلومات النموذجية بشكل مستقل؟ على سبيل المثال. الحساب مقابل معلومات الملف الشخصي

StackOverflow https://stackoverflow.com/questions/2322032

سؤال

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

على سبيل المثال ، أود الحصول على Name, Bio و Location ليتم تحريرها على أ Profile الصفحة أو علامة التبويب ، و login, email و password ليتم تحريرها على Account الصفحة أو علامة التبويب.

ما هي أفضل الممارسات ، والطريقة الأكثر أمانًا ، لإنجاز ذلك؟ هل يجب أن يكون لدي طراز/موارد منفصلة: المستخدم والمستخدم؟ أو يمكنني فقط إنشاء شيء مثل profile الطريقة في UserController, ، مع نموذج مخصص مع حقول الملف الشخصي المحدد فقط ، وربطه في صفحة المستخدم؟ أنا مرتبك حقًا حول كيفية القيام بذلك.

شكرا مقدما على أي أفكار قد تكون لديك.

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

المحلول

أعتقد أن ذلك يعتمد على بقية طلبك. يبدو أنه في حالتك ، من الجيد أن تكون معياريًا. إذا كنت تريد أن يكون المستخدمون قادرين على رؤية ملف تعريف المستخدمين الآخرين ، فمن الميزة أن يكون لها نموذج منفصل لملف التعريف ومثله مع علاقة HAS_ONE. سأتصل بالفصل فقط Profile لذلك يمكن الوصول إليه من خلال user.profile في وحدات التحكم الخاصة بك ووجهات النظر.

عارضات ازياء:

class User < ActiveRecord::Base
  has_one :profile, :dependent => :destroy
end

class Profile < ActiveRecord::Base
  belongs_to :user
end

نصائح أخرى

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

لا أرى هنا أي مشاكل أمنية. في حالة التحرير ، يجب حماية كلا الإجراءات (تحرير الحساب والملف الشخصي) بنفس الطريقة - لذلك يجب أن يكون مستخدم المالك فقط قادرًا على تحرير كلاهما. إذا كان يريد "اختراقه" وتحرير تسجيل الدخول إليه أيضًا عندما يقوم بتحرير اسمه الأول ، فهذه مشكلته. لن يتسبب ذلك في أي مشكلة لأنه يُسمح له بتحرير كلا الحقلين.

وفقًا للآراء التي يمكن عرضها للأشخاص الآخرين: فقط لا تعرض هناك أي حقول تنتمي إلى جزء الحساب.

كيف تفصله؟ بالنسبة لي أنظف طريقة هي إضافة هذا النوع من الطرق:

map.resources :accounts
map.resources :profiles

واستخدام مسارات مثل /accounts/34/edit لتحرير جزء الحساب و /profiles/34/edit لتحرير جزء الملف الشخصي.

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

يمكنك أيضًا القيام بذلك مع وحدة تحكم واحدة:

map.resources :accounts, :controller => 'users'
map.resources :profiles, :controller => 'users'

لكنني لا أعرف كيفية تمرير بعض القيمة الإضافية مع الطرق التي تم إنشاؤها مع resources. عندما تستخدم connect يمكنك تمريره مع :defaults => {:foo => 'bar'} وبعد ذلك سيكون متاحًا في وحدة التحكم params[:foo] لكن يبدو أنه لا يعمل مع resources. فكيف يمكنك التمييز بين الحسابات والملفات التعريف؟ يمكنك قراءته من عنوان URL الحالي (هنا مثال). ثم في وحدة التحكم ، يمكنك تقديم طرق عرض مختلفة وفقًا للموارد المطلوبة.

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

ومع ذلك ، في مرحلة معينة من أنظامي ، أميل إلى سحب معلومات الملف الشخصي من فئة المستخدم الأساسية ، بحيث يصبح المستخدم فقط للمصادقة.

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