0

人々が他の人をフォローできるレールアプリケーションを作成しています。データベースには偽装した約 100 人のユーザーがいます。次のコードを使用して、フェイカー ジェムを使用して、偽のユーザーと偽の関係をデータベースにアップロードしました。

def make_relationships
  users = User.all
  user  = users.first
  followed_users = users[2..50]
  followers      = users[3..40]
  followed_users.each { |followed| user.follow!(followed) }
  followers.each      { |follower| follower.follow!(user) }
end

これにより、ユーザー 1 はユーザー 2 ~ 50 をフォローし、ユーザー 1 はユーザー 3 ~ 40 をフォローするようになります。しかし、私はこれが起こっているとは思わない。ユーザー 3 ~ 51 のプロフィール ページにアクセスすると、[フォローをやめる] ボタンが表示されます。これは、これらのユーザー全員が 1 によってフォローされていることを意味します。なぜ 51 がこれに含まれているのかわかりません。何らかの理由で、ユーザー 2 または 51 歳以上のユーザーのプロファイルに移動すると、次のようになります。

undefined method `model_name' for NilClass:Class
Extracted source (around line #1):

1: <%= form_for(current_user.relationships.find_by_followed_id(@user.id)) do |f| %>
2:   <div><%= f.hidden_field :followed_id %></div>
3:   <%= f.submit "Follow", class: "btn btn-large btn-primary" %>
4: <% end %>

51 歳以上のプロフィール ページにアクセスできない理由を誰か教えてもらえますか? 関連するコードの残りの部分は次のとおりです。

関係モデル:

class Relationship < ActiveRecord::Base
  attr_accessible :followed_id, :follower_id

  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"

  validates :follower_id, presence: true
  validates :followed_id, presence: true
end

ユーザーモデル:

 class User < ActiveRecord::Base
 has_many :microposts, dependent: :destroy

 has_many :relationships, foreign_key: "follower_id", dependent: :destroy
 has_many :followed_users, through: :relationships, source: :followed

 has_many :reverse_relationships, foreign_key: "followed_id", class_name: "Relationship", dependent: :destroy
 has_many :followers, through: :reverse_relationships, source: :follower
 attr_accessible :email, :name, :password, :password_confirmation, :remember_token

ビューの部分に従ってください:

<%= form_for(current_user.relationships.find_by_followed_id(@user.id)) do |f| %>
    <div><%= f.hidden_field :followed_id %></div>
    <%= f.submit "Follow", class: "btn btn-large btn-primary" %>
<% end %>

ビューの部分的なフォローを解除:

<%= form_for(current_user.relationships.find_by_followed_id(@user),
    html: {method: :delete}) do |f| %>
    <%=f.submit "Unfollow", class: "btn btn-large" %>
<% end %>

上記の 2 つのパーシャルをレンダリングするフォームに従います。

<% unless current_user?(@user) %>
  <div id="follow_form">
  <% if current_user.following?(@user) %>
    <%= render 'unfollow' %>
  <% else %>
    <%= render 'follow' %>
  <% end %>
  </div>
<% end %>

ちなみに、これはMichael Hardtlチュートリアルからのもので、誰でもこれを解決するのに役立ちます.

4

1 に答える 1