سؤال

باستخدام تنسيق متعدد الخطوط (عن قصد) ل HAML، أود الحصول على الأسطر التالية في قالب الخاص بي:

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

-# and

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

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

-# This fails:
= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |
= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

والانفصال مع استراحة الخط، ومن المثير للاهتمام بما فيه الكفاية، لا أفضل:

-# This fails, too:
= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

حل العمل الوحيد الذي وجدته هو تشغيل سطر فارغ من رمز روبي بين. التي تبدو قبيحة حقا.

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |
-
= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

هل هناك أي شيء أفضل؟

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

المحلول

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

def blatz_link
  call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3',
    :foo4 => 'bar4', :foo5 => 'bar5'
end

def blootz_link
  call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3',
    :foo4 => 'bar4', :foo5 => 'bar5'
end

ثم في haml الخاص بك، فقط تفعل

= blatz_link
= blootz_link

والتي ستكون أكثر قابلية للقراءة وأسهل لفهمها.


إذا كان يجب عليك تماما اتباع كتلة Multiline واحدة مع أخرى، فما عليك سوى إضافة تعليق بين:

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |
-#
= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |

نصائح أخرى

لقد واجهت نفس المشكلات والحلول التي تم ذكرها هنا، والغريبة (ونعم، فمن الغريب) سلوك HAML فيما يتعلق بالكتل متعددة الخطوط قد عضني عدة مرات. أعلم أنه من المقصود وأنه كان من المفترض أن يجبر المستخدم على جعل رمزه أسهل في القراءة. ومع ذلك، فهي حقيقة معروفة أن كل مطور لديه تفضيلاته الخاصة عندما يتعلق الأمر بالهيكلة. Haml هي اللغة الوحيدة التي أعرفها (C، C ++، Ruby، Python، HTML، إلخ) التي تحاول فرض هذه القيود.

إن استدعاء الميزة المتعددة بخط ميزة بدلا من علة، يشير فقط إلى تصميم لغة معيبة. في النهاية سيكون دائما خطأ في عيون المستخدم. الدعم متعدد الخطوط هو ميزة أساسية لأي لغة دفق رئيسية وعدم وجود هذه الميزة هي مجرد annoing عادي - تماما مثل M $ PaperClip، والتي أعتقد أنها كانت أيضا محاولة لتوجيه المستخدم.

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

حتى نصل إلى هناك، أعتقد أننا سيتعين علينا العمل حول اللغة باستخدام Hack "- #" ...

يمكنك استخدام كتلة على المساعد الخاص بك، والعائد مهما كان المنطقي.

module SomeHelper
  def call_to_helper
    foo = Foo.new
    yield foo
    # build your html here, using the foo object's attributes
  end

  class Foo
    attr_accessor :foo1, :foo2, :foo3, :foo4, :foo5
  end

end

الآن على HAML الخاص بك:

= call_to_helper do |foo|
  -foo.foo1 = 'bar1'
  -foo.foo2 = 'bar2'
  -foo.foo3 = 'bar3'
  -foo.foo4 = 'bar4'
  -foo.foo5 = 'bar5'

= call_to_helper do |foo|
  -foo.foo1 = 'bar1'
  -foo.foo2 = 'bar2'
  -foo.foo3 = 'bar3'
  -foo.foo4 = 'bar4'
  -foo.foo5 = 'bar5'

إنه اختراق (فرز)، ولكن يمكنك دائما استخدام "+" بدلا من "=" على خطوطك الثانية والثالثة وما إلى ذلك في السلسلة.

= call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |
+ call_to_helper :foo1 => 'bar1', :foo2 => 'bar2', :foo3 => 'bar3', |
  :foo4 => 'bar4', :foo5 => 'bar5' |
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top