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

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

ただいまの
回答率

89.06%

Railsで発生したRouting Errorが解決できません。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,289

s_tatsuki

score 43

前提・実現したいこと

RailsでTweetAppというSNSアプリを勉強している時に
いいね機能を作っている時に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Routing Error
uninitialized constant LikesController
Rails.root: /home/progate/tweet_app

Application Trace | Framework Trace | Full Trace
Routes
Routes match in priority from top to bottom

Helper    HTTP Verb    Path    Controller#Action
Path / Url        
Path Match
POST    /likes/:post_id/create(.:format)    
likes#create

POST    /likes/:post_id/destroy(.:format)    
likes#destroy

POST    /users/:id/update(.:format)    
users#update

GET    /users/:id/edit(.:format)    
users#edit

users_create_path    POST    /users/create(.:format)    
users#create

signup_path    GET    /signup(.:format)    
users#new

users_index_path    GET    /users/index(.:format)    
users#index

GET    /users/:id(.:format)    
users#show

login_path    POST    /login(.:format)    
users#login

logout_path    POST    /logout(.:format)    
users#logout

GET    /login(.:format)    
users#login_form

posts_index_path    GET    /posts/index(.:format)    
posts#index

posts_new_path    GET    /posts/new(.:format)    
posts#new

GET    /posts/:id(.:format)    
posts#show

posts_create_path    POST    /posts/create(.:format)    
posts#create

GET    /posts/:id/edit(.:format)    
posts#edit

POST    /posts/:id/update(.:format)    
posts#update

POST    /posts/:id/destroy(.:format)    
posts#destroy

GET    /    
home#top

about_path    GET    /about(.:format)    
home#about

Request
Parameters:

{"_method"=>"post",
 "authenticity_token"=>"+Jv5+gec6GZBMmhW4te56EsZ/JEgwkwecqRZxjpwkwwmHP0vmR4iFG1uVEWwnS5fm1F628h5FQPv5UCYn8R8pA==",
 "instanceId"=>"00b46870d4f6",
 "containerPort"=>"3000",
 "languageName"=>"rails5",
 "locale"=>"ja",
 "post_id"=>"1"}
Toggle session dump
Toggle env dump
Response
Headers:

None

該当のソースコード

#Postモデル
class Post < ApplicationRecord
  validates :content, {presence: true, length: {maximum: 140}}
  validates :user_id, {presence: true}

  def user
    return User.find_by(id: self.user_id)
  end
end
#Userモデル
class User < ApplicationRecord
  validates :name, {presence: true}
  validates :email, {presence: true, uniqueness: true}

  def posts
    return Post.where(user_id: self.id)
  end
end
#views/posts/show.html.erb
<div class="main posts-show">
  <div class="container">
    <div class="posts-show-item">
      <div class="post-user-name">
        <img src="<%= "/user_images/#{@user.image_name}" %>">
        <%= link_to(@user.name, "/users/#{@user.id}") %>
      </div>
      <p>
        <%= @post.content %>
      </p>
      <div class="post-time">
        <%= @post.created_at %>
      </div>
      <% if Like.find_by(user_id: @current_user.id, post_id: @post.id) %>
        <%= link_to("/likes/#{@post.id}/destroy", {method: "post"}) do %>
          <span class="fa fa-heart like-btn-unlike"></span>
        <% end %>
      <% else %>
        <%= link_to("/likes/#{@post.id}/create", {method: "post"}) do %>
          <span class="fa fa-heart like-btn"></span>
        <% end %>
      <% end %>

      <% if @post.user_id == @current_user.id %>
        <div class="post-menus">
          <%= link_to("編集", "/posts/#{@post.id}/edit") %>
          <%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>
        </div>
      <% end %>
    </div>
  </div>
</div>
#Postsコントローラー
class PostsController < ApplicationController
  before_action :authenticate_user
  before_action :ensure_correct_user, {only: [:edit, :update, :destroy]}

  def index
    @posts = Post.all.order(created_at: :desc)
  end

  def show
    @post = Post.find_by(id: params[:id])
    @user = @post.user
  end

  def new
    @post = Post.new
  end

  def create
    @post = Post.new(
      content: params[:content],
      user_id: @current_user.id
      )
    if @post.save
      flash[:notice] = "投稿を作成しました"
      redirect_to("/posts/index")
    else
      render("posts/new")
    end
  end

  def edit
    @post = Post.find_by(id: params[:id])
  end

  def update
    @post = Post.find_by(id: params[:id])
    @post.content = params[:content]
    if @post.save
      flash[:notice] = "投稿を編集しました"
      redirect_to("/posts/index")
    else
      render("posts/edit")
    end
  end

  def destroy
    @post = Post.find_by(id: params[:id])
    @post.destroy
    flash[:notice] = "投稿を削除しました"
    redirect_to("/posts/index")
  end

  def ensure_correct_user
    @post = Post.find_by(id: params[:id])
    if @current_user.id != @post.user_id
      flash[:notice] = "権限がありません"
      redirect_to("/posts/index")
    end
  end
end
#Likesコントローラー
class LikesController < ApplicationController
  before_action :authenticate_user

  def create
    @like = Like.new(user_id: @current_user.id, post_id: params[:post_id])
    @like.save
    redirect_to("/posts/#{params[:post_id]}")
  end

  def destroy
    @like = Like.find_by(user_id: @current_user.id, post_id: params[:post_id])
    @like.destroy
    redirect_to("/posts/#{params[:post_id]}")
  end

end
#ルーティング
Rails.application.routes.draw do
  post "likes/:post_id/create" => "likes#create"
  post "likes/:post_id/destroy" => "likes#destroy"

  post "users/:id/update" => "users#update"
  get "users/:id/edit" => "users#edit"
  post "users/create" => "users#create"
  get "signup" => "users#new"
  get "users/index" => "users#index"
  get "users/:id" => "users#show"
  post "login" => "users#login"
  post "logout" => "users#logout"
  get "login" => "users#login_form"

  get "posts/index" => "posts#index"
  get "posts/new" => "posts#new"
  get "posts/:id" => "posts#show"
  post "posts/create" => "posts#create"
  get "posts/:id/edit" => "posts#edit"
  post "posts/:id/update" => "posts#update"
  post "posts/:id/destroy" => "posts#destroy"

  get "/" => "home#top"
  get "about" => "home#about"
end

試したこと

最初、アソシエーションを試しに使って見たかったので、1対多の関係(has_many,belongs_to)を用いて答えとは違う書き方で進めていましたが、このページでエラーが発生して、元の答えと一緒のコードで書き直しましたが一緒のエラーが発生しました。

補足情報(FW/ツールのバージョンなど)

ProgateのRailsレッスンの最終課題の道場コース、「いいね機能をつくろう」のところで発生しています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

LikesControllerのファイルが、きちんとapp/controllers/likes_controller.rbにありますか?

Railsのオートロードはファイル名を基準に進みますので、ファイル名が正しくないとロードに失敗します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/28 13:49 編集

    なるほどです!!!確認したらファイル名が
    `likes_controller.rb` ではなく `likes.controller.rb` になってしまっていました;;
    ありがとうございます!

    キャンセル

  • 2019/01/28 13:55

    自分自身、「ファイル名ミス」には時折遭遇します。

    キャンセル

  • 2019/01/28 14:18

    そうなんですね!(笑)
    こういったエラーコードはどうやったら読めるようになりますか;;

    キャンセル

  • 2019/01/28 14:21

    「uninitialized constant LikesController」を和訳すれば、「LikesControllerという定数が定義されていません」となります。

    で、クラスが未定義になっている場合は大きく分けて「呼ぶべき名前が違う」「定義が本当にない」、そして「定義はされているけどロードに失敗」というパターンがあります。すでにLikesControllerの定義がなされていましたので、前2つの線は消えて「ロード失敗」という理由がメインに浮上した、という感じです。

    キャンセル

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

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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