

前提・実現したいこと

Ruby on Rails にて写真アプリを作成中です。  
写真を「Delete」しようとすると下記のエラーメッセージが表示されてしまいます。  
どのように対処したらよろしいでしょうか？

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

[![https://gyazo.com/21705ed118a90aaf65dd127e348f4a2f](https://i.gyazo.com/21705ed118a90aaf65dd127e348f4a2f.png)](https://gyazo.com/21705ed118a90aaf65dd127e348f4a2f)

ソースコード 1「photos_controller.rb」

[code]

    class PhotosController < ApplicationController
      before_action :login_check, only: [:new, :edit, :update, :destroy]
    
      before_action :set_current_user_photo, only: [:edit, :update, :destroy]
    
      # GET /photos
      # GET /photos.json
      def index
        @photos = Photo.all
      end
    
      # GET /photos/1
      # GET /photos/1.json
      def show
        @photo = Photo.includes(:user).find(params[:id])
        @comments = @photo.comments.includes(:user).all
        @comment = @photo.comments.build(user_id: current_user.id) if current_user
      end
    
      # GET /photos/new
      def new
        @photo = current_user.photos.build
      end
    
      # GET /photos/1/edit
      def edit
      end
    
      # POST /photos
      # POST /photos.json
      def create
        @photo = Photo.new(photo_params)
    
        respond_to do |format|
          if @photo.save
            format.html { redirect_to @photo, notice: 'Photo was successfully created.' }
            format.json { render :show, status: :created, location: @photo }
          else
            format.html { render :new }
            format.json { render json: @photo.errors, status: :unprocessable_entity }
          end
        end
      end
    
      # PATCH/PUT /photos/1
      # PATCH/PUT /photos/1.json
      def update
        respond_to do |format|
          if @photo.update(photo_params)
            format.html { redirect_to @photo, notice: 'Photo was successfully updated.' }
            format.json { render :show, status: :ok, location: @photo }
          else
            format.html { render :edit }
            format.json { render json: @photo.errors, status: :unprocessable_entity }
          end
        end
      end
    
      # DELETE /photos/1
      # DELETE /photos/1.json
      def destroy
        @photo.destroy
        respond_to do |format|
          format.html { redirect_to photos_url, notice: 'Photo was successfully destroyed.' }
          format.json { head :no_content }
        end
      end
    
      private
      def login_check
        unless user_signed_in?
          flash[:alert] = "ログインしてください"
          redirect_to root_path
        end
      end
    
      # Use callbacks to share common setup or constraints between actions.
      def set_current_user_photo
        @photo = current_user.photos.find(params[:id])
      end
    
      # Never trust parameters from the scary internet, only allow the white list through.
      def photo_params
        params.require(:photo).permit(:image, :caption, :user_id)
      end
    end
    
[/code]

ソースコード ②「index.html.erb」

[code]

    <p id="notice"><%= notice %></p>
    
    <h1>Listing Comments</h1>
    
    <table>
      <thead>
      <tr>
        <th>User</th>
        <th>Photo</th>
        <th>Body</th>
        <th colspan="3"></th>
      </tr>
      </thead>
    
      <tbody>
      <% @comments.each do |comment| %>
        <tr>
          <td><%= comment.user_id %></td>
          <td><%= comment.photo_id %></td>
          <td><%= comment.body %></td>
          <td><%= link_to 'Show', comment %></td>
          <td><%= link_to 'Edit', edit_comment_path(comment) %></td>
          <td><%= link_to 'Destroy', comment, method: :delete, data: { confirm: 'Are you sure?' } %></td>
        </tr>
      <% end %>
      </tbody>
    </table>
    
    <br>
    
    <%= link_to 'New Comment', new_comment_path %>
    
[/code]


CC BY-SA 3.0
2016-01-23T07:38:06.213
21219
2016-01-24T06:34:46.813
2016-01-24T06:34:46.813
85
13449
question
ruby-on-rails ruby
Ruby on Rails にて写真アプリのDelete時のエラー


該当データが存在しないようですので、まずはphotosテーブルに削除対象となる該当のデータが存在するか確認してはどうでしょうか？確認の方法は、

  * GUIのViewerツール(SequelProなど)で確認する
  * `rails consle`コマンドからActiveRecord経由で確認する
  * コマンドライン(mysql, psqlなど)で直接確認する

などがあるかと思います。

また、Railsのデバッグで一般的な`pry`を利用するのも一つの手段です。`pry`の導入や使い方に関しては <http://ruby-
rails.hatenadiary.com/entry/20141024/1414081224>
こちらの記事が参考になりますので、よろしければご覧ください。  
例えば、今回のコードですと、

[code]

    def set_current_user_photo
      binding.pry
      @photo = current_user.photos.find(params[:id])
    end
    
[/code]

上記位置に`binding.pry`を追加し、まずは`current_user.photos`が取得できるかを確認してみて、少しずつ何が原因か探っていくと良いかもしれません。

ちなみに、`find`メソッドは該当データがない場合、今回のように`ActiveRecord::RecordNotFound`が発生しますので、もし例外を発生させずにエラーハンドリングをしたい場合は`find_by(id:
params[:id])`とすると良いかと思います。

参考: 単一のオブジェクトを取り出す  
<http://railsguides.jp/active_record_querying.html#%E5%8D%98%E4%B8%80%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99>


CC BY-SA 3.0
2016-01-23T13:07:24.900
21230
2016-01-24T01:29:01.563
2016-01-24T01:29:01.563
13874
13874
21219
answer