Работа с nil во взглядах (т.е. nil author в @ post.author.name) - PullRequest
2 голосов
/ 09 июля 2010

Я хочу показать имя автора сообщения; <% @post.author.name %> работает, если автор не равен нулю. Поэтому я либо использую unless @post.author.nil?, либо добавляю метод author_name, который проверяет nil, как в <% @post.author_name %>. Последнее я стараюсь избегать.

Проблема в том, что мне может понадобиться добавить / удалить слова в зависимости от того, есть значение или нет. Например, «Опубликовано на 1/2/3» будет содержанием, если я просто выведу ноль. Мне нужно удалить «по», если автор - ноль.

Ответы [ 4 ]

6 голосов
/ 09 июля 2010

Шаблон нулевого объекта - один из способов избежать этого. В вашем классе:

def author
  super || build_author
end

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

class PostPresenter
  def initialize(post)
    @post = post
  end

  def post_author
    (@post.author && @post.author.name) || 'Anonymous'
  end
end

Другой способ - использовать try, как в @post.author.try(:name), если вы можете к этому привыкнуть.

3 голосов
/ 09 июля 2010

Вы можете использовать try:

<%= @post.author.try(:name) %>

Он попытается вызвать метод name для @post.author, если он не равен нулю. В противном случае он вернет ноль, и исключение не будет выдано.


Ответьте на свой второй вопрос: В принципе нет ничего плохого в следующем:

<% if @post.author %>
  written by <%= @post.author.name %>
<% end %>

или

<%= "written by #{@post.author.name}" if @post.author %>

Но если это повторяющийся шаблон, вы можете написать вспомогательный метод для него.

# app/helpers/authors_helper.rb or app/helpers/people_helper.rb
class AuthorsHelper
  def written_by(author)
    "written by #{author.name}" if author
  end
end

# in your views
<%= written_by(@post.author) %>
0 голосов
/ 09 июля 2010

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

Боюсь, я еще не ставил ни одного тестано вы можете попробовать http://github.com/reubenmallaby/acts_as_nothing (я использую Ruby 1.9.1, поэтому дайте мне знать, если у вас возникнут проблемы в комментариях или на Github!)

0 голосов
/ 09 июля 2010

Напишите метод, который принимает любую переменную и проверяет, является ли она пустой, а если нет, то отображает ее. Тогда вам нужно написать только один метод.

...