Rails View DRYness - Вы устанавливаете переменные в представлении или просто делаете чистые методы? - PullRequest
4 голосов
/ 30 ноября 2010

У меня есть вид, в котором у меня одна и та же ссылка 3 раза (фактический вид большой):

%h1= link_to "Title", model_path(@model, :class => "lightbox")
= link_to "Check it out", model_path(@model, :class => "lightbox")
%footer= link_to "Last time", model_path(@model, :class => "lightbox")

Этот model_path(@model, :class => "lightbox") вызов, хотя и достаточно чистый, можно сделать еще более скромным, оборачивая его в это (возможно, у вас было еще несколько вариантов, так что это стоило того):

def popup_model_path(model)
  model_path(model, :class => "lightbox")
end

Мой вопрос: мне приходится пересчитывать этот путь 3 раза в представлении. Каков предпочтительный способ а) высушить это и б) оптимизировать производительность?

Я думаю, что установка переменных в верхней части представления может быть хорошей идеей:

- path = model_path(@model, :class => "lightbox")
-# ... rest of view

Это почти как усы в конце концов. Что ты думаешь?

Ответы [ 3 ]

3 голосов
/ 30 ноября 2010

Я думаю, что использование переменных в представлении - хорошая идея здесь. Поскольку эти вызовы методов абсолютно одинаковы.

Решение, предложенное Мэттом, я предпочитаю в некоторых случаях, но не в этом случае, потому что я нахожу его запутанным: тот факт, что оно кэшируется в методе, неясен, и если я хочу увидеть две разные модели в на одной странице я по-прежнему получаю первую кэшированную ссылку для обеих моделей.

Так что в этом случае я бы выбрал несколько более явный подход и назначил его переменной в представлении.

2 голосов
/ 30 ноября 2010

I действительно ненавижу ставить переменные в представлении.Я бы изменил ваш помощник на

def popup_model_path(model)
  @model_path ||= {}
  @model_path[model] ||= model_path(model, :class => "lightbox")
end

, чтобы «запомнить» его, и просто сохранить три вызова функций.

0 голосов
/ 30 ноября 2010

Это похоже на возможный случай преждевременной оптимизации. Создание такой функции, как popup_model_path, является фантастически СУХОЙ идеей. Особенно, если этот фрагмент кода, каким бы кратким он ни был изначально, будет часто использоваться в нескольких представлениях. Однако беспокоиться о влиянии на производительность вычисления пути 3 раза в одном представлении, на мой взгляд, не нужно. Если мы не говорим о чем-то, что будет использоваться десятки или сотни раз за просмотр, и вы ожидаете много-много одновременных пользователей, и приложение работает на общем сервере, или что-то еще, я действительно не вижу, что вы в настоящее время оказывает какое-либо ощутимое влияние на производительность.

Как правило, я стараюсь избегать переменных в моем коде представления. Они затрудняют чтение и, за некоторыми исключениями (такими как переменные, непосредственно связанные с циклами, которые отображают такие вещи, как списки), я чувствую, что они как бы идут вразрез с концепцией MVC, насколько я понимаю.

Я думаю, что прежде всего вы должны стремиться к тому, чтобы код был легко читаемым, понятным и поддерживаемым; как для себя, так и для тех, кто ранее не был знаком с вашим проектом. popup_model_path сейчас у вас все достаточно просто, чтобы любой, кто знает Rails, мог следить за тем, что вы делаете. Я не вижу необходимости делать это более сложным, поскольку это не очень повторяющееся. Хотелось бы найти этот отличный пост в блоге, который я помню, когда читал некоторое время назад, и это показало, что СУШКА вашего кода - это здорово, но у него есть свои пределы, и, как и у всех замечательных вещей, в конечном итоге вступает в силу закон убывающей доходности.

...