nozaki_3
@nozaki_3 (野崎)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

delete後のリダイレクト

解決したいこと

素人質問ですみません。投稿を削除した後、投稿一覧にリダイレクトしたいのですが、toppageにリダイレクトしてしまい、上手くいきません。解決方法を教えていだだきたいです。

該当するソースコード

ルーティングは下記のようになっています

 Prefix Verb   URI Pattern                    Controller#Action
          root GET    /                              toppages#index
         login GET    /login(.:format)               sessions#new
               POST   /login(.:format)               sessions#create
        logout DELETE /logout(.:format)              sessions#destroy
        signup GET    /signup(.:format)              users#new
         users POST   /users(.:format)               users#create
     edit_user GET    /users/:id/edit(.:format)      users#edit
          user GET    /users/:id(.:format)           users#show
               PATCH  /users/:id(.:format)           users#update
               PUT    /users/:id(.:format)           users#update
    microposts GET    /microposts(.:format)          microposts#index
               POST   /microposts(.:format)          microposts#create
 new_micropost GET    /microposts/new(.:format)      microposts#new
edit_micropost GET    /microposts/:id/edit(.:format) microposts#edit
     micropost GET    /microposts/:id(.:format)      microposts#show
               PATCH  /microposts/:id(.:format)      microposts#update
               PUT    /microposts/:id(.:format)      microposts#update
               DELETE /microposts/:id(.:format)      microposts#destroy

microposts_controllerは下記のようになっています

class MicropostsController < ApplicationController

  before_action :require_user_logged_in
  before_action :correct_user, only: [:edit,:update,:destroy,:show]

  def index 
    @microposts = current_user.microposts.order(id: :desc).page(params[:page]).per(10)

  end

  def update
    @micropost = Micropost.find(params[:id])

    if @micropost.update(micropost_params)
      flash[:success] = '保存されました。'
      redirect_to @micropost
    else
      flash.now[:danger] = '保存されませんでした。'
      render :edit
    end
  end

  def edit
    @micropost = Micropost.find(params[:id])
  end

  def show 
    @micropost=Micropost.find(params[:id])
  end

  def create
    @micropost = current_user.microposts.build(micropost_params)
    if @micropost.save
      flash[:success] = '記事を投稿しました。'
      redirect_to root_url
    else
      @microposts = current_user.microposts.order(id: :desc).page(params[:page])
      flash.now[:danger] = '記事を投稿できませんでした。'
      render 'toppages/index'
    end
  end

  def destroy
    @micropost.destroy
    flash[:success] = '記事を削除しました。'
    redirect_back(fallback_location: microposts_path)

  end



   private

  def micropost_params
    params.require(:micropost).permit(:content,:title)
  end

  def correct_user
    @micropost = current_user.microposts.find_by(id: params[:id])
    unless @micropost
      redirect_to root_url
    end
  end

end


viewは下記のようになっています


<h3>記事編集:「<%= @micropost.title %>」</h3>

<%= form_with(model: @micropost, local: true) do |f| %>
        <p>タイトル</p>
        <div class="form-group">
          <%= f.text_area :title, class: 'form-control', rows: 1%>
        </div>
    <p>内容</p>
        <div class="form-group">
          <%= f.text_area :content, class: 'form-control', rows: 18 %>
        </div>

        <%= f.submit '保存する', class: 'btn btn-success btn-block mt-5' %>

      <% end %>

<%= link_to "削除する", @micropost , method: :delete, data: { confirm: "本当に削除しますか?" }, class: 'btn btn-danger btn-block mt-2' %>

自分で試したこと

@micropostの箇所をmicroposts_pathにしたところルーティングエラーが起きてしまいました。

0

3Answer

Comments

  1. @nozaki_3

    Questioner

    回答ありがとうございます。コントローラーの内容を追加しました。
  before_action :correct_user, only: [:edit,:update,:destroy,:show]

  ...

  def correct_user
    @micropost = current_user.microposts.find_by(id: params[:id])
    unless @micropost
      redirect_to root_url
    end
  end

destroyする前にactionがありますよね?これが引っかかってそもそもdestroy出来ていないのでは?

0Like

Comments

  1. @nozaki_3

    Questioner

    確認したのですが、正常に削除はされているようです。
  def destroy
    @micropost.destroy
    flash[:success] = '記事を削除しました。'
#    redirect_back(fallback_location: microposts_path)

  end

このラインをコメントアウトしてもrootに移動します?

0Like

Comments

  1. @nozaki_3

    Questioner

    コメントアウトしたのですが、rootに移動してしまいました。また、1回目の削除では削除されず、2回目で削除されるようになってしまいました。
  2. @nozaki_3

    Questioner

    current_userメソッドのredirect_to root_urlとなっていたため、投稿を消したことによってunless部分が実行され、rootにリダイレクトしていたようです。redirect_to microposts_pathにしたところ解決しました。お手数おかけしてすみません。@github0013さん、ありがとうございました。

Your answer might help someone💌