フォロー機能の実装で悩んでいます…
このようにフォロー解除はできるのですが、フォローができずに困っております…
##エラー文
ActionView::Template::Error (No route matches {:action=>"destroy", :controller=>"relationships", :user_id=>#<User id: 1, nickname: "ゲスト用", email: "guest@example.com", created_at: "2020-10-23 13:14:23", updated_at: "2020-10-23 13:14:23">}, missing required keys: [:id]): 1: <!-- フォロー解除ボタン ------------------------------------------------------------------> 2: <%= form_for(current_user, url: user_relationship_path(@user), method: :delete, remote: true) do |f| %> 3: <%= f.submit "フォロー解除", class: "btn btn-outline-secondary" %> 4: <% end %>
エラー分はこちらになります。。
missing required keys: [:id]
と書いてあるのでフォローなどを管理している「relationships」のIDカラムがありませんよーと言ってていることは、理解できました
画面をリロードするとしっかりデータベースからフォローの情報は消えたり、追加されたりしているので、Ajaxの処理に問題があると仮定しています
ここから長くなりますがコードを添付させていただきます
どうかみなさまお力をお貸しください…
##記述内容
ビューからみていきます
app/views/users/show.html.erb <%= render "follow_form" %>
このrenderの中身が↓です
app/views/_follow_form.html.erb <% if user_signed_in? && @user != current_user %> <div id="follow_form"> <% if current_user.following?(@user) %> <%= render "unfollow" %> #フォローしていたらrenderを呼び出す <% else %> <%= render "follow" %> #フォローしてなかったらこのrenderを呼び出す <% end %> </div> <% end %>
今回のエラーは、「フォローする」を押した後に画面が切り替わらないので、followの方に問題があると思っていますなので<%= render "follow" %>をみていきます
app/views/users/_follow.html.erb <%= form_for(current_user, url: user_relationships_path(@user), method: :post, remote: true) do |f| %> <%= hidden_field_tag :following_id, @user.id %> <%= f.submit "フォローする", class: "btn btn-outline-secondary" %> <% end %>
remote: trueでJS形式で送信しています
###コントローラーかモデルに問題があると思っています…
コントローラーの記述
app/controllers/relationships_controller.rb def create @user = User.find(params[:following_id]) current_user.follow(@user) end
モデルの記述
app/model/user.rb def follow(user) following_relationships.create!(following_id: user.id) end
ルーティング
config/routes.rb user_relationships POST /users/:user_id/relationships(.:format) relationships#create user_relationship DELETE /users/:user_id/relationships/:id(.:format) relationships#destroy
create.js.erbで受け取っています
app/views/relarionships/create.js.erb $("#follow_form").html("<%= j(render("users/unfollow")) %>");
<%= j(render("users/unfollow")) %>でuser/unfollowに移動
app/views/relationships/create.js.erb $("#follow_form").html("<%= j(render("users/unfollow")) %>");
<%= j(render("users/unfollow"のusers/unfollowをみていきます
app/views/user/_unfollow.html.erb <!-- フォロー解除ボタン ------------------------------------------------------------------> <%= form_for(current_user, url: user_relationship_path(@user), method: :delete, remote: true) do |f| %> <%= f.submit "フォロー解除", class: "btn btn-outline-secondary" %> <% end %>
このような記述になっております
皆様方のお力をお貸しください…(;_;)
よろしくお願いいたします
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/25 00:08