0

Каков наилучший способ добавления классов в ячейки таблицы в рельсах на основе разных критериев для каждой ячейки?Rails: специальные классы на основе параметров в представлениях

Например, у меня есть ячейка даты: если дата наступает 10 дней с этой даты, вам нужно добавить класс «предстоящий». Или, если дата прошла сегодня, добавьте класс «прошлых лет».

В другой ячейке, на основе строки, она должна иметь класс «включено» или «выключен».

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

Пожалуйста посоветуйте.

ответ

0

Вы можете выполнить его с чем-то вроде этого:

class="#{(@date - Time.now <= 10.days) ? upcoming_due : '' %>"

Однако, как вы упомянули, это не хорошо, чтобы иметь много логики в представлении. Если вы нашли себя повторять один и тот же код, вы можете добавить вспомогательные методы, которые выглядят следующим образом:

def upcoming(date) 
    (date - Time.now <= 10.days) ? 'upcoming_due' : '' 
end 

def past(date) 
    (date - Time.now <= 10.days) ? 'past_due' : '' 
end 

На ваш взгляд, вы бы что-то вроде этого:

class="#{ upcoming(@date).presence || past(@date).presence || '' }"

+0

Так что я могу ссылаться на эти действия в представлении, с контроллера? Должен ли он быть моим контроллером входа? Как рельсы знают, где найти эти методы? –

+0

Вы можете получить доступ к вспомогательным методам в своих представлениях. Я думаю, что Rails находит эти методы посредством соглашения об именах. 'app/views/user/*' будет использовать 'app/helpers/user_helper.rb'. Если это утилита, которую вы хотите использовать для нескольких видов, вы можете поместить ее в 'app/helpers/application_helper.rb' – John

0

Это звучит как что я сделал бы с Нокаутом в браузере. В основном вы создаете модель нокаута с наблюдаемым полем для каждого поля в вашей базе данных и вычисленными полями для определения имен классов или любого другого, основываясь на этих полях. Затем вы используете атрибуты привязки данных в шаблоне HTML для привязки к вычисленным полям нокаута.

Недостатки этого подхода состоят в том, что пользователям необходимо будет включить javascript для корректного применения классов, и вы добавите немного логики в javascript. Но я думаю, что файлы javascript - прекрасное место для размещения логики отображения.

+0

В этом случае, почему бы мне просто не использовать jQuery? Вероятно, самый прямой подход, не так ли? –

+0

Использование javascript для этого не проходит тест запаха. В итоге вы получите хрупкую DOM для отображения статического контента. – John

+0

@ Джон, тест на запах? Frail DOM? –

Смежные вопросы