Направляющие: изящный способ отобразить сообщение, когда нет никаких элементов в базе данных

Я полностью согласен с Марком в этом, но добавлю немного больше. Когда вы посмотрите на преимущества создания универсального репозитория, общий шаблон - это IRepository и Repository. Одна вещь, которую я нахожу гораздо более полезной, раскрытая Джереми Д. Миллером (не могу найти ссылку), - это использование дженериков на уровне методов.

Так что у моего IReposity будут методы, подобные этому:

T FindByKey<T>(int key);
IEnumerable<T> FindAll();
T FindBy<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression);
void Update<T>(entity);

Затем, в зависимости от вашей философии, вы можете передать класс Repository и запросить его напрямую, или сделать вашу реализацию Repository абстрактной и заставить ее использовать быть инкапсулированным в явном хранилище, например:

CrmRepository : Repository
{
   FindByCustomerId(int customerId)
   { return FindByKey<Customer>(customerId);}
}
66
задан Dan McGrath 9 February 2010 в 19:37
поделиться

7 ответов

Если вы используете параметр : collection для рендеринга, например render: partial => 'message',: collection => @messages , то вызов to render вернет nil , если коллекция пуста. Затем это можно включить в || выражение eg

<%= render(:partial => 'message', :collection => @messages) || 'You have no messages' %>

Если вы не сталкивались с этим раньше, render : collection визуализирует коллекцию с использованием одного и того же партиала для каждого элемента, делая каждый элемент @messages доступным через локальная переменная , сообщение , поскольку она составляет полный ответ. Вы также можете указать разделитель, который будет отображаться между каждым элементом, используя : spacer_template => "message_divider"

61
ответ дан 24 November 2019 в 14:46
поделиться

Один из способов - сделать что-то вроде:

<%= render(:partial => @messages) || render('no_messages') %>

Изменить:

Если я правильно помню, это стало возможным благодаря этой фиксации:

http://github.com/rails / rails / commit / a8ece12fe2ac7838407954453e0d31af6186a5db

16
ответ дан 24 November 2019 в 14:46
поделиться

Вы можете создать собственный помощник. Следующий пример - это просто пример.

# application_helper.html.erb
def unless_empty(collection, message = "You have no messages", &block)
  if collection.empty?
    concat(message)
  else
    concat(capture(&block))
  end
end

# view.html.erb
<% unless_empty @messages do %>
  <%# code or partial to dispaly the message %>
<% end %>
6
ответ дан 24 November 2019 в 14:46
поделиться

Вы можете разделить свои два случая на разные шаблоны: один, если сообщения существуют, и один, если сообщений нет. В действии контроллера (возможно, MessagesController # index ) добавьте в качестве последнего оператора:

render :action => 'index_empty' if @messages.blank?

Если сообщений нет, отобразится app / views / messages / index_empty.html.erb . Если есть сообщения, оно пропадет и отобразит app / views / messages / index.html.erb , как обычно.

Если вам нужно больше, чем одно действие, вы можете провести рефакторинг его во вспомогательный метод, подобный следующему (непроверенный):

def render_action_or_empty (collection, options = {})
    template = params[:template] || "#{params[:controller]}/#{params[:action]}"
    template << '_empty' if collection.blank?
    render options.reverse_merge { :template => template }
end

При этом вам просто нужно поместить render_action_or_empty (@var) в конец любого действия контроллера, и он отобразит либо действие ' 'template или' action_empty ', если ваша коллекция пуста.

0
ответ дан 24 November 2019 в 14:46
поделиться

Этот код можно сократить до:

<%= @messages.empty? ? 'You have no messages.' : @messages.collect { |msg| formatted_msg(msg) }.join(msg_delimiter) %>

Комментарии:

formatted_msg () - вспомогательный метод, который добавляет форматирование к сообщению

msg_delimiter - переменная, содержащая разделитель типа "\ n" или "
"

Кстати, я бы предложил использовать пустой? метод вместо пустого? для проверки массива, потому что а) его название более лаконично :) и б) пустое? - это метод расширения ActiveSupport, который не работает вне Rails.

0
ответ дан 24 November 2019 в 14:46
поделиться

В качестве примечания, вы также можете просто перебрать пустой массив, если ищете эффективность выражения:

<% @messages.each do |message|  %>
  <%# code or partial to dispaly the message %>
<% end %>
<% if (@messages.blank?) %>
  You have no messages.
<% end %>

Хотя это не обрабатывает @messages равное нулю, оно должно работать для большинства ситуаций. Внедрение нерегулярных расширений того, что должно быть рутинным представлением, вероятно, усложняет простую в остальном вещь.

Что может быть лучшим подходом, так это определить партиал и помощник для визуализации «пустых» разделов, если они достаточно сложные:

<% render_each(:message) do |message|  %>
  <%# code or partial to dispaly the message %>
<% end %>

# common/empty/_messages.erb
You have no messages.

Вы можете определить это как:

def render_each(item, &block)
  plural = "#{item.to_s.pluralize}"
  items = instance_variable_get("@#{plural}")
  if (items.blank?)
    render(:partial => "common/empty/#{plural}")
  else
    items.each(&block)
  end
end
3
ответ дан 24 November 2019 в 14:46
поделиться

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

<% if @messages.each do |message| %>
  <%# code or partial to display the message %>
<% end.empty? %>
  You have no messages.
<% end %>
159
ответ дан 24 November 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: