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

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

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

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

Q&A

解決済

2回答

528閲覧

Rails showページでDBからの情報が表示できない

akanenne

総合スコア6

Ruby on Rails

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

1グッド

0クリップ

投稿2020/03/13 05:43

編集2020/03/13 06:17

前提・実現したいこと

ポートフォリオページをrailsで作成しています。
詳細ページを作成中ですが、DBのカラム情報の表示ができません。
どうかご教授いただけますでしょうか
初心者ですがどうぞよろしくお願いいたします。

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

NoMethodError in Portfolio#show
Showing /home/ec2-user/environment/portfolio/app/views/portfolio/show.html.erb where line #6 raised:

undefined method `title' for nil:NilClass

ActionView::Template::Error (undefined method `title' for nil:NilClass): 3: 4: <div class="slick1"> 5: 6: <p><%= @works.title %></p> 7: <p><%= @works.detail %></p> 8: 9: <img style="background-image: url_for(works.images);"></img> app/views/portfolio/show.html.erb:6:in `_app_views_portfolio_show_html_erb__1563797991912808332_70127707796960'

該当のソースコード

routes.rb

Rails.application.routes.draw do root to: 'portfolio#index' resources :portfolio get 'portfolio' => 'portfolio#index' get 'portfolio/new' => 'portfolio#new' post 'portfolio' => 'portfolio#create' post 'works' => 'portfolio#create' get 'portfolio' => 'portfolio#show' end

portfolio.controller.rb

class PortfolioController < ApplicationController def index @works = Work.all end def new @works = Work.new end def create @works = Work.create(create_params) end private def create_params params.require(:work).permit(:title, :detail, :genre, images: []) end def show @works = Work.find(params[:id]) end def update end def edit end end

show.html.erb

<main class="contents"> <p class="midashi2">作品</p> <div class="slick1"> <p><%= @works.title %></p> <p><%= @works.detail %></p>

試したこと

@worksのインスタンス関数の設定で、モデルの指定をしており、データの保存の確認はできています。

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

基本的なことかもしれませんがどうぞよろしくお願いいたします。

s.k👍を押しています

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

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

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

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

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

hatsu

2020/03/13 06:00

エラーメッセージが見れないので、お手隙で見えるように貼っていただけると!
akanenne

2020/03/13 06:18

ご指摘ありがとうございます。編集しました。よろしくお願いいたします。
guest

回答2

0

ベストアンサー

routes.rbが

get 'portfolio' => 'portfolio#show'

とされていますが、以下のようにすると

get 'portfolio/:id' => 'portfolio#show'

portfolio/1 とかにアクセスすると params[:id]が取得できるようになって
@works = Work.find(params[:id])がnilではなくなって、エラーも解決されるかもです。

投稿2020/03/13 06:25

hatsu

総合スコア1809

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

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

akanenne

2020/03/13 06:33

ご教授ありがとうございます。 ただ残念ながら、エラーは変わりませんでした。。
hatsu

2020/03/13 06:35

resources :portfolio だといかがでしょう? また def show @works = Work.find(params[:id]) end def update end def edit end はprivateより上に書いてください。
hatsu

2020/03/13 06:37

localhost:3000/portfolio/1 で表示されるのは、Workのidが1のデータがあることが前提です。
akanenne

2020/03/13 08:07

show のメゾットを、privateより上に記述したところ解決しました。 privateの優勢が邪魔してたのですね!またよく調べてみます(>_<) ありがとうございました!!
guest

0

showアクションがprivateメソッドの中に入っているので、@worksを呼び出せないのではないでしょうか?

投稿2020/03/13 07:30

no1knows

総合スコア3365

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

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

akanenne

2020/03/13 08:09

ご回答ありがとうございます。ご指摘の通りです。ベストアンサーは先にお答えくださった方におつけいたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問