وضع منطق العرض في وحدة تحكم هو ممارسة جيدة في روبي?
-
12-12-2019 - |
سؤال
بعض التوصيات [1] أقترح عليك استخدام
<%= current_user.welcome_message %>
بدلا من
<% if current_user.admin? %>
<%= current_user.admin_welcome_message %>
<% else %>
<%= current_user.user_welcome_message %>
<% end %>
ولكن المشكلة هي يجب أن يكون لديك منطق القرار في مكان ما في التعليمات البرمجية الخاصة بك.
فهمي هو وضع القرار في template
أفضل من controller
لأنها تجعل وحدة التحكم الخاصة بك أكثر نظافة.هل هو صحيح?
هل هناك طريقة أفضل للتعامل مع هذا?
المحلول
في رأيي، إذا كان النص هو الشيء الوحيد الذي يتغير، فهذا لا ينتمي إلى عرض.إذا كنت بحاجة إلى إعادة هيكلة الصفحة، فهذا منطق العرض.هذا، هذه مجرد بيانات مختلفة.
نصائح أخرى
أنت لست أول من يتساءل هذا.إذا وجهات النظر والتحكم يجب أن يكون قليلا إلى أي منطق, وينبغي أن يكون نموذج عرض الملحد, أين منطق العرض تنتمي?
تبين أنه يمكننا استخدام تقنية قديمة تسمى نمط الديكور.والفكرة هي التفاف كائن النموذج الخاص بك مع فئة أخرى تحتوي على منطق العرض التقديمي الخاص بك.تسمى فئة الغلاف هذه بـ ديكور.يستخلص المصمم المنطق بعيدا عن وجهة نظرك ، مع إبقاء النماذج الخاصة بك معزولة عن عرضها التقديمي.
درابر هو جوهرة ممتازة تساعد على تحديد الديكور.
يمكن استخلاص نموذج التعليمات البرمجية التي قدمتها مثل ذلك:
تمرير الديكور إلى الرأي مع @user = UserDecorator.new current_user
في وحدة التحكم الخاصة بك.
الديكور الخاص بك يمكن أن تبدو على النحو التالي.
class UserDecorator
decorates :user
def welcome_message
if user.admin?
"Welcome back, boss"
else
"Welcome, #{user.first_name}"
end
end
end
وسوف تحتوي وجهة نظرك ببساطة @user.welcome_message
لاحظ أن النموذج نفسه لا يحتوي على المنطق لإنشاء الرسائل.بدلا من ذلك ، يلف المصمم النموذج ويترجم بيانات النموذج إلى نموذج أنيق.
نأمل أن يساعد هذا!
وأود أن استخدام مساعد لهذا الغرض.لنفترض أنه يتعين عليك ترجمة رسالة الترحيب ، بناء على بعض الإعدادات المحلية.
في ال app/helper/user_helper.rb
اكتب
module UserHelper
def welcome_message(user)
if user.admin?
I18n.t("admin_welcome_message", :name => user.name)
else
I18n.t("user_welcome_message", :name => user.name)
end
end
end
وفي وجهة نظركم يمكنك بعد ذلك مجرد كتابة
<%= welcome_message(user) %>
لاحظ أن الديكور/مقدم يقدم نهج وجوه المنحى نظيفة حقا ، ولكن إمهو باستخدام مساعد هو أبسط من ذلك بكثير وكافية.
لا ، أنت لا تريد أي الشرطية على الإطلاق في فئة المستخدم ولا وحدة تحكم.النقطة من هذا المثال على بلوق وظيفة هو الإشارة إلى تعدد الأشكال ، مجرد تصميم و الطراز القديم جيدة.
# in application_controller for example
def current_user
if signed_in?
User.find(session[:user_id])
else
Guest.new
end
end
#app/models/user.rb
class User
def welcome_message
"hello #{name}"
end
end
#app/models/guest.rb
class Guest
def welcome_message
"welcome newcomer"
end
end
...تحصل على هذه الفكرة.
فقط ، بدلا من رمي النموذج الخاص بك بأساليب العرض التقديمي فقط ، قم بإنشاء مصمم ديكور يعمل كمقدم:
require 'delegate'
class UserPresenter < SimpleDelegator
def welcome_message
"hello #{name}"
end
end
و الأن current_user
يبدو مثل ذلك:
# application_controller
def current_user
if signed_in?
UserPresenter.new(User.find(session[:user_id]))
else
Guest.new
end
end
تزيين نموذج المستخدم وإضافة welcome_message له مباشرة.نعم، قد ينطوي هذا على نوع من العبارات الشرطية في مرحلة ما.
http://robots.thoughedbot.com/post//14825364877 / تقييمات التقييم-البديل-decorator - في
أعتقد أنك يجب أن تشاهد الحلقة Railscasts على مقدمي العروض على الإجابة.
المنطق في الرأي يصعب الحفاظ عليها، يجب أن نضع منطق العمل في النموذج وجميع المنطق الرؤية في المساعدين.
إذا كنت تريد أن يكون الكود الخاص بك في الأزياء الموجهة للكائنات، فاستفيد من الديكور (طريقة وجوه موجهة نحو المساعدين)
أفضل مثال: https://github.com/jcasimir/draper
وضع رمز تعريف current_user.welcome_message
في التطبيق / المساعدين / مساعد التطبيق.رب_ ، فإنه سيتم بعد ذلك يمكن الوصول إليها من قبل أي عرض المقدمة مع التطبيق تخطيط.
خيار آخر هو تحديد أ مخصص وحدة مساعد ، واحد الذي لا يرتبط بالضرورة مع وجهة نظر معينة أو وحدة تحكم (انظر الفيديو أنا مرتبطة أدناه) ، و include
في وحدات العرض / وحدات التحكم التي ترغب في الحصول على هذه الوظيفة فيها.
هذا ليس شيئا أبيض وأسود.ولكن ، من ما كنت قد وصفت يبدو أن هذا هو رمز الذي هو نافرة لعصا في أبليكاتيون_كونترولر الخاص بك.رب وليس رمز مع وظيفة الذي يبرر انها تحكم الخاصة ، قد يكون الخيار الأكثر فعالية وكفاءة لإنشاء وحدة مساعد مخصص وإدراجه في المساعدين كنت ترغب في الحصول على هذه الوظيفة.ومع ذلك ، هذا هو في نهاية المطاف دعوة الحكم الذي مصمم التطبيق (أي. أنت) يحتاج إلى اتخاذ قرار بشأن.
هنا هي مقالة جيدة تحدد الوحدات المساعدة من مايو, 2011
هنا هو عبارة عن مخطط للسكك الحديدية مخصص وحدات المساعد (أي.مخصص كما هو الحال في الوحدات النمطية التي لا ترتبط بالضرورة بوحدة تحكم أو طريقة عرض معينة).قصيرة ، حلوة ، وإلى هذه النقطة.
يمكنك تحديد طريقة المساعد لهذا الاشياء.لا أعتقد أنها فكرة جيدة أن تجعل جمل موضع ترحيب في نموذج، ولكن في وحدة تحكم أيضا.ولكن يجب أن تحاول أن تجعلك تنظر نظف من التعليمات البرمجية، وإذا كنت تستطيع استخدام المساعدين من أجل ذلك، فعليك ذلك.
ممارسة جيدة أن يكون حقيقي View
حالات.القضبان ساخرة من MVP (هناك فرق البحث عنه) للأسف يبدو أن ندعي أن آراء قوالب.وهذا هو الخطأ.
مناظر من المفترض أن تحتوي على عرض منطق في MVC و MVC مستوحاة من الأنماط.كما أنها من المفترض أن التعامل مع قوالب متعددة وجعل القرار الذي قوالب تستخدم لتمثيل الدولة و المعلومات من نموذج طبقة (نعم ، هو نموذج طبقة لا ORM سبيل المثال).
لذا للإجابة على السؤال: عرض المنطق لا مكان له في وحدات تحكم.