質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

1739閲覧

rails6 フォロー機能実装時のエラー

EleAco

総合スコア15

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/10/24 04:49

編集2020/10/24 06:29

フォロー機能の実装で悩んでいます…

イメージ説明
このようにフォロー解除はできるのですが、フォローができずに困っております…

##エラー文

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 %>

このような記述になっております
皆様方のお力をお貸しください…(;_;)
よろしくお願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ここでidって必須のキーがないっていわれていますね。

missing required keys: [:id]): 1: <!-- フォロー解除ボタン ------------------------------------------------------------------> 2: <%= form_for(current_user, url: user_relationship_path(@user), method: :delete, remote: true) do |f| %>

routes.rbを確認してみると引数にuser_idとidが必要なようです。つまり、このIDがなかったのですね。

user_relationship DELETE /users/:user_id/relationships/:id(.:format)

idに本来はRelationShipのIDを渡したいところですが、たとえばひとまず適当な値を以下のように入れるといかがでしょうか

user_relationship_path(user_id: @user, id: 1)

投稿2020/10/24 13:39

hatsu

総合スコア1809

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

EleAco

2020/10/25 00:08

hatsuさんご回答ありがとうございます! ``` app/views/users/_unfollow.html.erb <%= form_for(current_user, url: user_relationship_path(user_id: @user, id: @user), method: :delete, remote: true) do |f| %> ``` このように記述したら問題なく動きました なぜか分かりませんが…w ひとまず解決いたしました! ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問