前提・実現したいこと
保存したデータを削除した
ネットにある画像urlを使い保存していた時には削除できていたが、CarrierWaveを導入して画像を保存するように変えたら保存したデータを削除することができなくなった
発生している問題・エラーメッセージ
該当のソースコード
#tweet.rb モデル belongs_to :user has_many :comments, dependent: :destroy has_many :images, dependent: :destroy belongs_to_active_hash :category mount_uploader :image, ImageUploader
#マイグレーションファイル ~省略~ create_table :tweets do |t| t.string :title, null: false t.string :text t.string :image, null: false t.integer :user_id t.integer :category_id, null: false t.timestamps ~省略~
ruby
1#tweets_controller.rb コントローラー 2~省略~ 3 def destroy 4 tweet = Tweet.find(params[:id]) 5 tweet.destroy 6 redirect_to action: 'index' 7 end 8 9~省略~ 10 def tweet_params 11 params.require(:tweet).permit(:title, :category_id, :image, :text).merge(user_id: current_user.id) 12 end 13
HTML
1<div class="row"> 2 <div class="container"> 3 <%= form_with(model: @tweet, local: true) do |f| %> 4 <h3>投稿する</h3> 5 <%= render 'shared/error_messages', model: f.object %> 6 <%= f.text_field :title, placeholder: "タイトル" %> 7 <%= f.collection_select :category_id, Category.all, :id, :name, { prompt: "選択してください" } %> 8 <%= f.file_field :image %> #画像フォーム 9 <%= f.text_area :text, placeholder: "コメント" , rows: "10" %> 10 <%= f.submit "SEND" %> 11 <% end %> 12 </div> 13</div>
試したこと
CarrierWaveを使って画像などを保存しているのでremove_image!を追加して保存されたものを消そうとしたが同じエラーが出た
ruby
1 def destroy 2 tweet = Tweet.find(params[:id]) 3 tweet.remove_image! 4 tweet.save 5 tweet.destroy 6 redirect_to action: 'index' 7 end
投稿のユーザーIDとログインしているユーザーIDが同じであれば消せるようにしたがuser_idがnil:classとエラーが出て削除できなかった
SequelProの保存データを見るとtweetsテーブルにuser_idがありちゃんと保存されていた
ruby
1 def destroy 2 if @tweet.user_id == current_user.id && @tweet.destroy 3 redirect_to action: 'index' 4 else 5 render :show 6 end 7 end
補足情報
CarrierWaveを使わずにネットにある画像urlを使い、画像などを保存していた時にはこちらのコードで削除できていた
ruby
1def destroy 2 tweet = Tweet.find(params[:id]) 3 tweet.destroy 4 redirect_to action: 'index' 5end
※HTMLの記載はhamlを変換ツールで変換したものなので誤字脱字の可能性あり
html
1<div class="row"> 2 <div class="container"> 3 <%= form_with(model: @tweet, local: true) do |f| %> 4 <h3>投稿する</h3> 5 <%= render 'shared/error_messages', model: f.object %> 6 <%= f.text_field :title, placeholder: "タイトル" %> 7 <%= f.collection_select :category_id, Category.all, :id, :name, { prompt: "選択してください" } %> 8 <%= f.text_field :image, placeholder: "投稿画像" %> 9 <%= f.text_area :text, placeholder: "コメント" , rows: "10" %> 10 <%= f.submit "SEND" %> 11 <% end %> 12 </div>
あなたの回答
tips
プレビュー