daichi0412
@daichi0412 (中原 大地)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ActiveRecord::RecordNotFound in TweetsController#show

ActiveRecord::RecordNotFound in TweetsController#show

Couldn't find Tweet with 'id'=show
下記のエラーの解消を行いたいです。

image.png

例)
Ruby on RailsでQiitaのようなWebアプリをつくっています。
記事を投稿する機能の実装中にエラーが発生しました。
解決方法を教えて下さい。

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

Couldn't find Tweet with 'id'=show

該当するソースコード

tweets_controller.rb
class TweetsController < ApplicationController
  before_action :authenticate_user!, only: [:new]
  before_action :set_tweet, only: [:show]


  def show
  end

  private

  def tweet_params
    params.require(:tweet).permit(:image, :text, :brand_id, :camera_id, :sensor_id, :resolution_id, :price).merge(user_id: current_user.id)
  end

  def set_tweet
    @tweet = Tweet.find(params[:id])
  end
end

show.html.erb
<div>
  <ul class='item-list'>
    <%if @tweets.present? %>
      <% @tweets.each do |tweet| %>
        <li class='list'>
          <div class='user_name'>
            <%= link_to(tweet.user.nickname, "/users/#{tweet.user.id}") %>
          </div>
          <%= link_to(tweet_path(tweet.id)) do %>
            <div class='item-img-content'>
              <%= image_tag tweet.image, class: 'item-img' %>
              <div class='item-info'>
                <h3>
                  Camera's brand: <%= tweet.brand.name %>
                </h3>
                <h3>
                  Camera's model: <%= tweet.camera.name %>
                </h3>
                <h3>
                  Sensor size: <%= tweet.sensor.name %>
                </h3>
                <h3>
                  Resolution: <%= tweet.resolution.name %>
                </h3>
                <h3>
                  price: <%= tweet.price %>yen
                </h3>
                <h3>
                  Text: <%= tweet.text %>
                </h3>
              </div>
            </div>
          <% end %>
        </li>
      <% end %>
    <% else %>
      <li class='list'>
        <%= link_to '#' do %>
        <%= image_tag "https://tech-master.s3.amazonaws.com/uploads/curriculums/images/Rails1-4/sample.jpg", class: "item-img" %>
        <div class='item-info'>
          <h3 class='item-name'>
            Post it!!
          </h3>
        </div>
        <% end %>
      </li>
    <% end %>
  </ul>
</div>

<div class="tweet-show">
  <div class="tweet-box">
    <div class="item-img-content">
      <%= image_tag @tweet.image ,class:"item-box-img" %>
    </div>
    <div class="item-price-box">
      <span class="item-price">
        <%= @tweet.price %>円
      </span>
    </div>
  <% if user_signed_in? && @tweet.purchase.nil? %>
    <% if current_user.id == @tweet.user_id %>
      <%= link_to 'edit', edit_tweet_path(@tweet.id), method: :get, class: "tweet-red-btn" %>
      <p class="or-text">or</p>
      <%= link_to 'delete', "/tweets/#{@tweet.id}", method: :delete, class:"tweet-destroy" %>
    <% else %>
      <%= link_to "purchase", tweet_purchases_path(@tweet.id), class:"item-red-btn"%>
    <% end %>
  <% end %>
</div>
routes.rb
Rails.application.routes.draw do
  devise_for :users
  root to: 'tweets#index'
  resources :tweets, only: [:index, :new, :create, :show, :edit, :update] do
  end
end  

どういったことが行いたいか

トップページから投稿一覧ページを表示したいです。
エラーの意味はわかるのですが、どうしたらエラーが解消されるかが全然わからず手が止まってしまっています。わかる方がいたら教えていただけると幸いです。

0

2Answer

アドレス部分が表示されていないので、どういうURLを表示した時にこのエラーが表示されるのか分かりませんが、要はそんなIDはないというエラーだと思います。

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313033343532312f61626635613835612d636463352d656533382d336534662d3135316435336530616333362e706e67-2.png

$ rails console
> Tweet.find("show")

とやってるのと同じです。

0Like

「投稿一覧ページにいきたい」ということは、おそらくコントローラーの「index」アクションを呼び出したいはずです。その時、tweetのid情報は必要ないはずです。しかし、@daichi0412さんの場合、「show」アクションを呼び出そうとしてしまっているため、「set_tweet」でidを取得したいのに、idが送られてきていないから、仕方なくidに「show」というものを代入してしまっているというエラーが発生しているのではないでしょうか。

ルーティングの設定ファイルをもう一度確認し、正しくindexアクションへと繋げられるように再度実装を試してみてください!

0Like

Comments

  1. そもそも投稿一覧を表示したいのに、コントローラーの「showアクション」やビューの「show.html.erb」を使用しているのも気になります。
  2. @daichi0412

    Questioner

    @technoship0329さん、返信ありがとうございます。
    @technoship0329がおっしゃる通り作る過程で途中までは一覧ページをindexアクションを呼び出すために記述していたんです。
    しかし、作り方を少し変えてトップページから投稿一覧ページにいくためにshowアクションを利用してページを遷移するように少し変えたんです。その場合にこのようなエラーが出てしまって、、
  3. show.html.erbにて投稿一覧を表示したいということですね。
    それならば、今show.html.erbで使用している@tweetsをコントローラーのshowアクションのところで取得しないといけないですよね?

    でも、現状のコードだと、showアクションでは「set_tweet」を呼び出して個別の@tweetを取得しようとしているため、エラーが出ていると思われます。

    showアクションに「@tweets = Tweet.all」のような形で記述した上で、今呼び出してしまっている「set_tweet」は呼び出さないようにしたら如何ですか?

Your answer might help someone💌