нужна пустая строка, но при получении исключения в ruby ​​на рельсах - PullRequest
1 голос
/ 25 мая 2010

контроллер

@articles = current_user.articles

вид

<% @articles.each do |article| %>
  <%= link_to "#{article.title} , #{article.author.name}" articles_path%>
<% end %>

Иногда у статьи нет автора, поэтому в базе данных отсутствует значение, что приводит к следующей ошибке

У вас есть нулевой объект, когда вы этого не ожидали! Произошла ошибка при оценке nil.name

Я все еще хочу вывести заголовок статьи в этом сценарии. Какой лучший способ сделать это, пожалуйста?

Ответы [ 6 ]

4 голосов
/ 25 мая 2010

Добавьте новый метод экземпляра к вашей Article модели.

class Article
  def title_and_author
    returning "" do |s|
      s << title
      s << ", " << author.name if author.name?
    end
  end
end

тогда по вашему мнению

<% @articles.each do |article| %>
  <%= link_to article.title_and_author, articles_path %>
<% end %>
2 голосов
/ 25 мая 2010

Еще одно решение:

<% @articles.each do |article| %>
  <%= link_to [article.title, article.author.try(:name)].reject{ |obj| obj.nil? }.join(', ') articles_path %>
<% end %>

Возможно, вам нужен помощник, если вы находите его слишком грязным.

2 голосов
/ 25 мая 2010

Для этого есть try метод

<% @articles.each do |article| %>
  <%= link_to "#{article.title} , #{article.author.try(:name)}" articles_path%>
<% end %>
2 голосов
/ 25 мая 2010

Полагаю, вы могли бы сделать что-то вроде этого:

<% @articles.each do |article| %>
  <%= link_to (article.author ? "#{article.title} , #{article.author.name}" : article.title), articles_path %>
<% end %>

Использование короткой формы if / else. Если автор существует, напечатайте заголовок и автора, если нет, напечатайте только заголовок.

1 голос
/ 25 мая 2010

Я бы пошел с созданием помощника, который оборачивается вокруг link_to. Что-то вроде:

def link_to_article(article)
  if article.author.nil?
    link_to "#{article.title}", article_path(article)
  else
    link_to "#{article.title} , #{article.author.name}" article_path(path)
  end
end

# and in view simply do:
<%= link_to_article(article) %>
1 голос
/ 25 мая 2010

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

Измените атрибут имени, чтобы он возвращал пустое значение, а не ноль

def name
  d = read_attribute(:name)
  d.nil? ? " " : d
end

Вставить пробел вместо нуля в базу данных

def before_save
  self.name = " " if self.name.nil?
end

В качестве альтернативы вы можете создать вспомогательный метод, который создает текст ссылки на основе существования имени или нет, например,

def link_text(title, name)
  if name.blank?
    title
  else
    "#{title} , #{name}"
end
...