Как использовать значение по умолчанию для местных жителей в HAML? - PullRequest
3 голосов
/ 29 декабря 2011

У меня есть шаблон HAML, который я хочу отобразить и, при желании, предоставить локальную переменную, называемую здесь post, чтобы она либо использовала предоставленную переменную в качестве значения атрибута элемента, либо использовала явное значение по умолчанию.

Приведенный ниже код показывает, что я имею в виду, но он не запускается, если не указано post.Есть ли чистое решение для этого?У меня есть довольно много таких полей, и я бы предпочел не повторять их с помощью операторов - if defined?, что является единственной альтернативой, которую я могу придумать.

%label
  Post title
  %input{:name  => "title",
         :value => (defined? post) ? post.title : ""} }

Ответы [ 3 ]

1 голос
/ 29 декабря 2011

Попробуйте сделать это следующим образом:

%input{:name => "title", :value => post ? post.title : ""}

Вам не нужно проверять с определенным, потому что nil интерпретируется как ложный в интерпретаторе Ruby.Этот отрывок из Eloquent Ruby от Russ Olsen описывает его лучше всего:

В Ruby только false и nil рассматриваются как false.Ruby рассматривает все остальное - и я имею в виду все - как true.

Если это приложение Rails, более красноречивым решением было бы использование метода Rails try:

%input{:name => "title", :value => post.try(:title)}

Метод try вызывает метод, идентифицируемый символом, который передается в классе, если только сам класс не равен nil, в этом случае он возвращает nil (который haml автоматически преобразуетв пустую строку). Подробнее о методе рельсов можно прочитать здесь .

0 голосов
/ 29 декабря 2011

Ах, оказывается, реальная проблема заключалась в том, что это в Sinatra, который определяет метод post для определения обработчиков для сообщений HTTP, и средство визуализации HAML может видеть это.

Если вы предоставили переменную post для средства визуализации, она скрывает его, поэтому шаблон работает нормально, но в противном случае post на самом деле является функцией, и поэтому defined? имеет значение true, но явно нет свойства title ,

Простое изменение имени переменной заставляет все работать так, как я ожидал.

0 голосов
/ 29 декабря 2011

Если вы просто хотите разобраться со случаем, когда некоторая переменная равна nil, вы можете использовать метод try.Например:

%input{:name  => "title", :value => post.try(:title) } }

Когда сообщение равно nil, оно просто возвращает nil;в противном случае возвращается post.title.

Однако , если вы хотите предоставить явные значения по умолчанию, вы должны либо написать помощник (что-то вроде default_if_nil), либо monkey-patch try метод, позволяющий указать значения по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...