Milky_English
@Milky_English

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Ruby on Rails .カラム名 でデータが取得できない

解決したいこと

Ruby on RailsでTwitterのようなウェブアプリを作っています。
データベースからデータを取得しようとして、エラーが発生しました。
解決方法を教えてください;;

発生している問題・エラー

Postというモデルを作りました。

posts_controller.rb の中身は以下の通りです。

class PostsController < ApplicationController
  def index
    @posts = Post.all
  end

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

end

sho.html.erb というビューを作成しました。内容は以下の通りです。

<div class="main posts-show">
  <div class="container">
    <div class="posts-show-item">
      <p>
        <%= @post.content %>
      </p>
      <div class="post-time">
        <%= @post.created_at %>
      </div>
    </div>
  </div>
</div>

ここで、NoMethodError が発生しました。
*データベースにはPostデータをいくつか入れています。

エラー文は以下の通りです。

Showing /home/ec2-user/environment/tweet_app/app/views/posts/show.html.erb where line #5 raised:

undefined method `content' for nil:NilClass

'.freeze;@output_buffer.append=( @post.content);@output_buffer.safe_append='

自分で試したこと

posts_controller.rb の中身の、@postの定義をfindに変えてみましたが、それでもエラーが発生しました;;

→ その際は、「ActiveRecord::RecordNotFound in PostsController#show Couldn't find Post with 'id'={:id=>"1"}」というエラーになりました。

ruby 3.1.2p20
Rails 7.0.5
を使用しています。

他に必要な情報があれば、おっしゃってくださいorz
どうかよろしくお願いいたします;;

補足

routes.rbの中身は以下の通りです。

Rails.application.routes.draw do
  get 'posts/index'
  get '/' => 'home#top'
  get "about" => "home#about"
  get "posts/:id" => "posts#show"
  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
  # Defines the root path route ("/")
  # root "articles#index"
end
0

1Answer

原因は2つ考えられます。

  1. 指定した ID の Post がデータベースに存在しない。
  2. PostsController#show への route が get 'posts/:id' のようになっていない。 route の :id の部分が params のキーになるため、たとえば route が get 'posts/:post_id' になっていたら、 ID は params[:post_id] で取得する必要がある。
1Like

Comments

  1. @Milky_English

    Questioner

    @usai様 

    丁寧なご回答、ありがとうございます。

    1. rails console を起動して確認できるので、1ではなさそうです。
    2. route も  get "posts/:id" => "posts#show" となっておりますので、違うようでした...

    一緒に考えてくださりありがとうございます;;

Your answer might help someone💌