Итерация по массиву моделей со сложными отношениями в Ruby - PullRequest
1 голос
/ 27 мая 2020

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

Модель пользователя имеет следующие отношения

  has_one :profile

  has_many :follower_relationships, class_name: "Follow", foreign_key: "following_id"
  has_many :followers, through: :follower_relationships, source: :follower

  has_many :following_relationships, class_name: "Follow", foreign_key: "user_id"
  has_many :following, through: :following_relationships, source: :following

Я пытаюсь составить список подписчиков какого-либо конкретного пользователя, но имена хранятся в профиле пользователя. Я пробовал сделать это:

In the conroller: 

def followers
  @followers = User.find_by(id: params[:user_id]).followers
end

In the html.erb file:

<% for i in 0..@followers.length %>
   <%= @followers[i].profile.first_name %>
<% end %>

Итак, я сначала попробовал for.each, прежде чем пробовать обычный для l oop. Но он всегда возвращает

ActionView::Template::Error (undefined method `first_name' for nil:NilClass):
    2:
    3:
    4: <% for i in 0..@followers.length %>
    5: <%= @followers[i].profile.first_name %>
    6: <% end %>

Однако установка <%= @followers.first.profile.first_name %> возвращает first_name первого последователя.

Почему вызов первого элемента в массиве работает, когда я пытаюсь это сделать, но не когда я пытаюсь выполнить итерацию по всему массиву?

1 Ответ

2 голосов
/ 28 мая 2020

Ну ... если использовать for-l oop. Вероятно, вам следует go из 0..(@followers.length - 1), если нет, он вернет ошибку (undefined method first_name 'for nil: NilClass) `, как вы видите.

<% for i in 0..(@followers.length-1) %>
   <%= @followers[i].profile.first_name %>
<% end %>

или еще лучше, используйте for.each и отправьте ошибку. если есть.

<% @followers.each do |f| %>
  <%= f.profile.first_name %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...