Вот мой код:
// в swimmer.rb (модель):
belongs_to :user
// в user.rb (модель):
has_one :swimmer, :dependent => :destroy
accepts_nested_attributes_for :swimmer, :allow_destroy => true
attr_accessible :swimmer_attributes
// в swimmers_controller.rb:
def profile
@swimmer = Swimmer.find_by_user_id(current_user)
@swimmer_nickname = @swimmer.nickname
@swimmer_gender = @swimmer.gender
@title = "Swimmer Profile for #{@current_user.email}"
end
// в profile.html.erb (в папке представлений пловцов)
<% if @swimmer %>
<h3><%= @title %></h3>
<p>Nickname: <%= @swimmer_nickname %></p>
<p>Gender: <%= @swimmer_gender %></p>
<% else %>
<h3>No Swimmer Profile for<%= current_user.email %></h3>
<% end %>
Если у объекта пловца есть user_id, который соответствует переменной экземпляра @swimmer в методе swimmers#controller, потому что есть пользователь, вошедший в систему (с помощью драгоценного камня Devise), и пловец был создан для этого пользователя, то представление профиля работает как предназначена. Если нет, на странице отображается ошибка:
NoMethodError (undefined method `nickname' for nil:NilClass):
app/controllers/swimmers_controller.rb:66:in `profile'
Но поскольку представление профиля имеет условие if/else, я хочу, чтобы отсутствие объекта пловца, связанного с вошедшим в систему пользователем, заставляло представление отображать содержимое else. По-видимому, метод «Swimmer.find_by_user_id(current_user)» создает нулевой объект в NilClass. Как мне сделать так, чтобы он ничего не создавал и тем самым вызывал условие else?
Репозиторий находится по адресу https://github.com/drollwit/vst2/tree/ver2. Это упражнение, а не настоящий проект. Вероятно, здесь есть простой ответ, но я не могу его понять (все еще изучаю основы Rails). Любая помощь будет оценена по достоинству.