أفضل طريقة لفرض الأذونات - وحدة التحكم أم القيد؟

لدي إضافة (plugin) تضيف نموذجًا يُدعى server يحتوي على حقل user_id. أريد أن يتمكن فقط مالك server من تنفيذ طلب POST (أو ربما يجب أن يكون PUT؟ — الإجراء سيقوم بإعادة بناء سطر أوامر لنسخة من Discourse على خادمهم؛ لست متأكدًا مما سيكون الأفضل من حيث الممارسات.)

في ملف config/routes.rb يوجد التالي:

post “/upgrade/:id” => “servers#queue_upgrade”, constraints: PfaffmanagerConstraint.new

هل يُنصح بأن تتحقق matches? في ملف pfaffmanager_constraint.rb من path_parameters[:action] وتفرض الإذن هناك، أم أن ذلك يُفعل في servers_controller.rb؟

أيضًا، أعتقد أن ما يجب عليّ فعله حقًا هو نقل هذا المسار تحت namespace :user، لذا ربما بعد أن أحل هذه المشكلة، سيتم حلها كجزء من ذلك، لكن هذا يعمل تقريبًا، وأود الانتقال إلى السماح لآخرين بتجربة هذا الكود.

يحتوي مسار Rails على الرابط التالي:
https://github.com/pfaffman/discourse-pfaffmanager/blob/master/config/routes.rb#L12

وتحاول إضافة التحكم في صلاحيات في المتحكم (controller) الخاص بي:

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/controllers/pfaffmanager/servers_controller.rb#L53-L70

لكن الاختبار (spec) الخاص بي يُرجع رمز استجابة 200 عندما يقوم مستخدم آخر بتنفيذ post:

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/spec/requests/servers_controller_spec.rb#L149-L157

أظن أنني بحاجة إلى جعل Ember يولي اهتمامًا لهذا الأمر بطريقة ما؟

ألا يمكنك تمرير دالة إلى before_action للتحقق من شرطك؟

أعتقد أن الصلاحيات يجب أن تُنفَّذ في وحدة التحكم أو القيود. فالنموذج لا يعرف من يستدعيه، كما أظن.

شكرًا جزيلاً لك على تفكيرك في هذا الأمر.

أعتقد أنك بحاجة إلى طريقة حارسة للتحقق مما إذا كان مسموحًا للمستخدم بتنفيذ إجراء معين. على سبيل المثال، can_upgrade_server?

أيضًا، بمجرد القيام بذلك، يمكنك استخدام طريقة guardian.ensure_can_upgrade_server! التي تتحقق من الشرط وتثير استثناءً، وهو ما أعتقد أنه بالضبط ما تريده.

أوه! طريقة الحارس! نعم! سأراجعها! شكرًا لك.

النموذج الوحيد الذي يستخدم guardian هو نموذج المستخدم. يبدو أن معظم العمليات المتعلقة بـ guardian تتم في وحدات التحكم (controllers).

على سبيل المثال، يستخدم وحدة تحكم الفئات ensure_can_create_category، وأعتقد أنه يتم إنشاؤه سحريًا في lib/guardian.rb.

لكن في الوقت الحالي، لا أستخدم guardian لأنني أواجه صعوبة في معرفة كيفية تهيئته (instantiation) بشكل صحيح. لدي هذا في وحدة التحكم الخاصة بي:

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/controllers/pfaffmanager/servers_controller.rb#L54-L75

وهذه هي الاختبارات (specs) التي تختبره:

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/spec/requests/servers_controller_spec.rb#L154-L181