Вы можете использовать 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) %>