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

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

ただいまの
回答率

90.12%

Unable to autoload constant Blog_content, expeceted 〜(ファイルの位置) to define it = モデル内のクラスをautoloadできません

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 138

ro-ki

score 17

作ろうとしている物

ブログ投稿サイト

困っていること

ユーザーの投稿一覧画面から、タイトルをクリックすることで投稿詳細ページに飛ばしたい。が、できない。

発生しているエラー

uninitialized constant BlogsController::Blog_contents

@blog = Blog_contents.find_by(id: params[:id])
→コントローラのこの部分に赤線

理解度と試していること

1、投稿一覧
飛ばす際に、paramsにクリックした投稿のid番号をパラメータとして付加し、コントローラのshowアクションに飛ばす。
※前提
投稿一覧画面では、インスタンス変数に@blogを用いています。(views/blogs/index.html.erb)

<div class="contents">
  <% @blog.each do |content|%>
    <p>
      <%= link_to(content.title_name, "/blogs/#{content.id}") %>
    </p>
  <% end %>
</div>

2、ルーティング(config/routes.rb)

Rails.application.routes.draw do
  root to: 'pages#index'
  resources :blogs
  devise_for :users, controllers:{
    regisrations: 'users/regisrations',
    sessions: 'users/sessions'
  }
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

補足:rake routesの結果

 Prefix Verb   URI Pattern                                                                              Controller#Action
                     root GET    /                                                                                        pages#index
                    blogs GET    /blogs(.:format)                                                                         blogs#index
                          POST   /blogs(.:format)                                                                         blogs#create
                 new_blog GET    /blogs/new(.:format)                                                                     blogs#new
                edit_blog GET    /blogs/:id/edit(.:format)                                                                blogs#edit
                     blog GET    /blogs/:id(.:format)                                                                     blogs#show
                          PATCH  /blogs/:id(.:format)                                                                     blogs#update
                          PUT    /blogs/:id(.:format)                                                                     blogs#update
                          DELETE /blogs/:id(.:format)                                                                     blogs#destroy
         new_user_session GET    /users/sign_in(.:format)                                                                 users/sessions#new
             user_session POST   /users/sign_in(.:format)                                                                 users/sessions#create
     destroy_user_session DELETE /users/sign_out(.:format)                                                                users/sessions#destroy
        new_user_password GET    /users/password/new(.:format)                                                            devise/passwords#new
       edit_user_password GET    /users/password/edit(.:format)                                                           devise/passwords#edit
            user_password PATCH  /users/password(.:format)                                                                devise/passwords#update
                          PUT    /users/password(.:format)                                                                devise/passwords#update
                          POST   /users/password(.:format)                                                                devise/passwords#create
 cancel_user_registration GET    /users/cancel(.:format)                                                                  devise/registrations#cancel
    new_user_registration GET    /users/sign_up(.:format)                                                                 devise/registrations#new
   edit_user_registration GET    /users/edit(.:format)                                                                    devise/registrations#edit
        user_registration PATCH  /users(.:format)                                                                         devise/registrations#update
                          PUT    /users(.:format)                                                                         devise/registrations#update
                          DELETE /users(.:format)                                                                         devise/registrations#destroy
                          POST   /users(.:format)                                                                         devise/registrations#create
       rails_service_blob GET    /rails/active_storage/blobs/:signed_id/*filename(.:format)                               active_storage/blobs#show
rails_blob_representation GET    /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show
       rails_disk_service GET    /rails/active_storage/disk/:encoded_key/*filename(.:format)                              active_storage/disk#show
update_rails_disk_service PUT    /rails/active_storage/disk/:encoded_token(.:format)                                      active_storage/disk#update
     rails_direct_uploads POST   /rails/active_storage/direct_uploads(.:format)                                           active_storage/direct_uploads#create

3、コントローラのshowアクション
paramsで付加したid番号から投稿を探し出して、インスタンス変数に代入する。(app/controller/blogs_controller)

class BlogsController < ApplicationController

  before_action :authenticate_user!
  #showを省いた
  before_action :set_blog, only: [:edit, :update, :destroy]


ここの部分。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
  def index
    @blog = current_user.blog_contents
  end

  def show
    @blog = Blog_contents.find_by(id: params[:id])
   →ここのコードに関してエラーが出ます。
  end
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
  def new
    @blog = current_user.blog_contents.build
  end

  def edit
  end

  def create
    @blog = current_user.blog_contents.build(blog_params)

    respond_to do |format|
      if @blog.save
        format.html { redirect_to blogs_path, notice: 'Note was successfully created.' }
        format.json { render :show, status: :created, location: @blog }
      else
        format.html { render :new }
        format.json { render json: @blog.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
      if @blog.update(note_params)
        format.html { redirect_to @blog, notice: 'Note was successfully updated.' }
        format.json { render :show, status: :ok, location: @blog }
      else
        format.html { render :edit }
        format.json { render json: @blog.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @blog.destroy
    respond_to do |format|
      format.html { redirect_to notes_url, notice: 'Note was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    def set_blog
      @blog = current_user.blog_contents.find_by(id: params[:id])
      redirect_to root_path if @blog.nill?
    end

    def blog_params
      params.require(:blog_content).permit(:title_name, :content)
    end
end

4、投稿詳細画面
インスタンス変数に代入された投稿のタイトルと、中身を表示する。(app/views/show.html.erb)

<div class="content">
  <%= @blog.title_name %>
  <%= @blog.content %>
</div>

5、ターミナルからログを確認した結果
投稿一覧画面から、id番号3の投稿をクリックし、詳細画面に飛ぼうとしている部分のログです。

Started GET "/blogs/3" for ::1 at 2019-06-26 20:19:48 +0900
Processing by BlogsController#show as HTML
  Parameters: {"id"=>"3"}
  User Load (3.7ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1
  ↳ /Users/horiguchihiroki/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
Completed 500 Internal Server Error in 13ms (ActiveRecord: 3.7ms)



NameError (uninitialized constant BlogsController::Blog_contents):

app/controllers/blogs_controller.rb:13:in `show'

問題解決のために試したこと

エラー文をググってそのサイトに書いてあることを確認しました。
https://qiita.com/imotan/items/c73fab5ee230114a08b6
ファイルとファイルの中のクラスの名前が一致していないこと(アンダーバーがあるかないか等)が問題のようなのですが、問題ないと思われます。

上記のサイトに書いてあることを真似して、config/initializers/requirements.rbを作成し、その中に該当コードを書くも、今度は「rails s」ができなくなり、エラー解決のためのエラー解決になりつつあり、1時間以上を使用した割に全く解決の糸口に至らないので、こちらで質問しながら解決していこうと考えました。
よろしくお願いします。

補足

ご回答ありがとうございます。
モデル名はblog_contentsです。

mysql> show tables;
+----------------------------+
| Tables_in_blog_development |
+----------------------------+
| ar_internal_metadata       |
| →blog_contents              |
| schema_migrations          |
| users                      |
+----------------------------+

ご指摘の通りに変更後、以下のエラーが表示されました。

Unable to autoload constant Blog_content

blog_contentがautoroadできないようなので、その原因を取り払ってあげればいいのか?と考え、
{https://teratail.com/questions/87201}こちらの記事を参考に、修正箇所を探そうと思ったのですが、スペルミスは発生していないようなので、修正できずにいます。
引き続き原因究明をしますが、ご指摘いただけると嬉しいです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+1

モデル名が何かわからないのですが、

current_user.blog_contents

でblogが取れているのであれば、

@blog = Blog_content.find_by(id: params[:id])

じゃないですかね?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/27 15:35

    ご回答ありがとうございます。質問を編集いたしました。
    ご確認お願い致します。

    キャンセル

+1

Railsの命名ルール的にテーブル名がblog_contentsであれば
モデルのクラス名はBlogContentになるかと思います。
app/models下にクラスがあるのでそこにあるクラス名を確認してみてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/28 02:06 編集

    ご回答ありがとうございます。ご推察の通り、モデルのなかのクラス名はBlogContentです。

    実は、昨日から工夫して、目的とする動きを実現することができました。
    その部分に関して自己解決したものを編集して載せておきます。
    ただ、どうしてうまくいくのかいまいちわかっておりません。
    そのため、別の質問としてまた書いていきたいと思います。
    今回はご回答ありがとうございました。別質問が出来次第、リンクを貼らせていただこうと思います。
    お時間あるときにご回答いただけますと幸いです。

    キャンセル

check解決した方法

0

自己解決結果

app/controller/blogs_controller

  def show
    @blog = BlogContent.find_by(id: params[:id])
  end


showアクションの中身を以下のように変更するとエラーが消え、無事に詳細画面にたどり着くことができるようになりました。
ただ、find_byメソッドを使えるのは、モデルの名前に対してのみだと考えており、なぜクラス名に対してこのような書き方ができるのかわかりません。
そちらの別質問に関するリンクを貼りますので、知見をお持ちの方是非ご教授ください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Rubyに関する質問
  • Unable to autoload constant Blog_content, expeceted 〜(ファイルの位置) to define it = モデル内のクラスをautoloadできません