سؤال

بعض التوصيات [1] أقترح عليك استخدام

<%= current_user.welcome_message %>

بدلا من

<% if current_user.admin? %>
  <%= current_user.admin_welcome_message %>
<% else %>
  <%= current_user.user_welcome_message %>
<% end %>

ولكن المشكلة هي يجب أن يكون لديك منطق القرار في مكان ما في التعليمات البرمجية الخاصة بك.

فهمي هو وضع القرار في template أفضل من controller لأنها تجعل وحدة التحكم الخاصة بك أكثر نظافة.هل هو صحيح?

هل هناك طريقة أفضل للتعامل مع هذا?

http://robots.thoughtbot.com/post/27572137956/tell-dont-ask

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

المحلول

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

نصائح أخرى

أنت لست أول من يتساءل هذا.إذا وجهات النظر والتحكم يجب أن يكون قليلا إلى أي منطق, وينبغي أن يكون نموذج عرض الملحد, أين منطق العرض تنتمي?

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

درابر هو جوهرة ممتازة تساعد على تحديد الديكور.

يمكن استخلاص نموذج التعليمات البرمجية التي قدمتها مثل ذلك:

تمرير الديكور إلى الرأي مع @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 سبيل المثال).

لذا للإجابة على السؤال: عرض المنطق لا مكان له في وحدات تحكم.

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