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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

解決済

rails6 フォロー機能 Unknown action

ro-ze1106
ro-ze1106

総合スコア4

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

1回答

0評価

0クリップ

284閲覧

投稿2021/12/11 02:40

編集2021/12/11 02:45

現在、フォロー機能を作成しています。
その中で、フォローやフォロワーの一覧を作成し、ページを確認したところエラーが発生しました。
エラー内容
Unknown action
The action 'following' could not be found for UsersController
Unknown action
The action 'followers' could not be found for UsersController

Controllerやroutesのスペルミスだと思い確認してみましたが、自分では見つけれませんでした。
他のサイトを見てもスペルミスと書いてある記事が多かったので何度も確認しましたが、分かりませんでした。
どうかご教授願います。

補足データ
rails 6.14
ruby 3.0.2
macOS 11.6

関連コード

rubycontroller

class UsersController < ApplicationController before_action :logged_in_user, only: %i[index edit update destroy following followers] before_action :correct_user, only: %i[edit update] def index @users = User.paginate(page: params[:page]) end def show @user = User.find(params[:id]) @problems = @user.problems.paginate(page: params[:page], per_page: 5) end def new @user = User.new end def create @user = User.new(user_params) if @user.save log_in @user flash[:success] = 'スタディログへようこそ' redirect_to @user else render 'new' end end def edit @user = User.find(params[:id]) end def update @user = User.find(params[:id]) if @user.update(user_params) flash[:success] = 'プロフィールの編集が完了しました。' redirect_to @user else render 'edit' end end def destroy @user = User.find(params[:id]) # 管理者ユーザーの場合 if current_user.admin? @user.destroy flash[:success] = 'ユーザーの削除に成功しました' redirect_to users_url # 管理者ユーザーではないが、自分のアカウントの場合 elsif current_user?(@user) @user.destroy flash[:success] = '自分のアカウントを削除しました' redirect_to root_url else flash[:danger] = '他人のアカウントは削除できません' redirect_to root_url end def following @title = "フォロー中" @user = User.find(params[:id]) @users = @user.following.paginate(page: params[:page]) render 'show_follow' end def followers @title = "フォロワー" @user = User.find(params[:id]) @users = @user.followers.paginate(page: params[:page]) render 'show_follow' end end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end # beforeアクション # ログイン済みユーザーかどうか確認 def logged_in_user unless logged_in? store_location flash[:danger] = 'ログインしてください' redirect_to login_url end end # 正しいユーザーかどうか確認 def correct_user @user = User.find(params[:id]) redirect_to(root_url) unless current_user?(@user) end def admin_user redirect_to(root_url) unless current_user.admin? end end

rubymodel

class User < ApplicationRecord has_many :problems, dependent: :destroy has_many :active_relationships, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy has_many :passive_relationships, class_name: "Relationship", foreign_key: "followed_id", dependent: :destroy has_many :following, through: :active_relationships,source: :followed has_many :followers, through: :passive_relationships,source: :follower attr_accessor :remember_token before_save { self.email = email.downcase } validates :name, presence: true, length: { maximum: 50 } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } has_secure_password validates :password, presence: true, length: { minimum: 6 }, allow_nil: true # 渡された文字列のハッシュ値を返す def self.digest(string) cost = if ActiveModel::SecurePassword.min_cost BCrypt::Engine::MIN_COST else BCrypt::Engine.cost end BCrypt::Password.create(string, cost: cost) end # ランダムなトークンを返す def self.new_token SecureRandom.urlsafe_base64 end # 永続セッションのためにユーザーをデータベースに記憶する def remember self.remember_token = User.new_token update_attribute(:remember_digest, User.digest(remember_token)) end # 渡されたトークンがダイジェストと一致したらtrueを返す def authenticated?(remember_token) return false if remember_digest.nil? BCrypt::Password.new(remember_digest).is_password?(remember_token) end # ユーザーのログイン情報を破棄する def forget update_attribute(:remember_digest, nil) end # フィード一覧を取得 def feed Problem.where('user_id = ?', id) end # ユーザーをフォローする def follow(other_user) following << other_user end # ユーザーをフォロー解除する def unfollow(other_user) active_relationships.find_by(followed_id: other_user.id).destroy end # 現在のユーザーがフォローしてたらtrueを返す def following?(other_user) following.include?(other_user) end # 現在のユーザーがフォローされたらtrueを返す def followed_by?(other_user) followers.include?(other_user) end end

routes

Rails.application.routes.draw do get 'sessions/new' get 'users/new' root 'static_pages#home' get :about, to: 'static_pages#about' get :use_of_terms, to: 'static_pages#terms' get :signup, to: 'users#new' get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' delete '/logout', to: 'sessions#destroy' resources :users do member do get :following, :followers end end resources :problems resources :relationships, only: [:create, :destroy] end

relationshipsschema

create_table "relationships", force: :cascade do |t| t.integer "follower_id" t.integer "followed_id" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.index ["followed_id"], name: "index_relationships_on_followed_id" t.index ["follower_id", "followed_id"], name: "index_relationships_on_follower_id_and_followed_id", unique: true t.index ["follower_id"], name: "index_relationships_on_follower_id" end

viewsharedstats

<% @user ||= current_user %> <div class="stats"> <a href="<%= following_user_path(@user) %>"> <strong id="following" class="stat"> <%= @user.following.count %> </strong> 人をフォロー </a> <a href="<%= followers_user_path(@user) %>"> <strong id="followers" class="stat"> <%= @user.followers.count %> </strong> 人のフォロワー </a> </div>

viewusershow

<% provide(:title, "プロフィール") %> <div class="container"> <h1>プロフィール<h1> <div class="row"> <aside class="col-md-2"> <div class="user-picture-box"> <%= gravatar_for @user, size: 100 %> </div> </aside> <div class="col-md-6"> <section class="user_name_info"> <%= @user.name %> </section> <section class="stats"> <%= render 'shared/stats' %> </section> <%= link_to "プロフィール編集", edit_user_path(@user) %> <%= render 'follow_form' if logged_in? %> </div> <div class="row"> <div class="col-md-9"> <% if @user.problems.any? %> <h3>問題 (<%= @user.problems.count %>)</h3> <ol class="problems"> <%= render @problems %> </ol> <%= will_paginate @problems %> <% end %> </div> </div> </div> </div>

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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