k12da
@k12da (K Yoshida)

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!

The page you were looking for doesn't exist.

herokuの本番環境でフィード投稿の削除ができるようにしたい。

railsチュートリアルで、herokuにデプロイした後、本番環境で投稿した内容を削除しようとすると、タイトルのようなエラーが発生します。

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

The page you were looking for doesn't exist.

You may have mistyped the address or the page may have moved.

If you are the application owner check the logs for more information.

スクリーンショット 2022-07-06 4.39.52.png

スクリーンショット 2022-07-06 4.39.58.png

確認したソースコード

内容などはほぼチュートリアルの通りにしているはずです。
下記に記載しているコードを確認・修正してデプロイし直しても変わらなかったです。

/sample_app/config/routes.rb
Rails.application.routes.draw do
  get 'password_resets/new'
  get 'password_resets/edit'
  get 'sessions/new'
  root 'static_pages#home'
  get '/help',    to: 'static_pages#help'
  get '/about',   to: 'static_pages#about'
  get '/contact', to: 'static_pages#contact'
  get '/signup',  to: 'users#new'
  get    '/login',   to: 'sessions#new'
  post   '/login',   to: 'sessions#create'
  delete '/logout',  to: 'sessions#destroy'
  resources :users do
    member do
      get :following, :followers
    end
  end
  resources :account_activations, only: [:edit]
  resources :password_resets,     only: [:new, :create, :edit, :update]
  resources :microposts,          omly: [:create, :destroy]
  resources :relationships,       only: [:create, :destroy]
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end

/sample_app/app/views/microposts/_micropost.html.erb
<li id="micropost-<%= micropost.id %>">
  <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %>
  <span class="user"><%= link_to micropost.user.name, micropost.user %></span>
  <span class="content">
    <%= micropost.content %>
    <%= image_tag micropost.display_image if micropost.image.attached? %>
  </span>
  <span class="timestamp">
    Posted <%= time_ago_in_words(micropost.created_at) %> ago.
    <% if current_user?(micropost.user) %>
      <%= link_to "delete", micropost, method: :delete,
                                       data: { confirm: "You sure?" } %>
    <% end %>
  </span>
</li>
/sample_app/app/views/users/_user.html.erb
<li>
  <%= gravatar_for user, size: 50 %>
  <%= link_to user.name, user %>
  <% if current_user.admin? && !current_user?(user) %>
    | <%= link_to "delete", user, method: :delete,
                                  data: { confirm: "You sure?" } %>
  <% end %>
</li>
sample_app/app/controllers/microposts_controller.rb
class MicropostsController < ApplicationController
  before_action :logged_in_user, only: [:create, :destroy]
  before_action :correct_user,   only: :destroy
  
  def create
    @micropost = current_user.microposts.build(micropost_params)
    @micropost.image.attach(params[:micropost][:image])
    if @micropost.save
      flash[:success] = "Micropost created!"
      redirect_to root_url
    else
      @feed_items = []
      render 'static_pages/home'
    end
  end
  
  def destroy
    @micropost.destroy
    flash[:success] = "Micropost deleted"
    redirect_to request.referrer || root_url
    #redirect_back(fallback_location: root_url)
  end
  
  private
  
    def micropost_params
      params.require(:micropost).permit(:content, :image)
    end
    
    def correct_user
      @micropost = current_user.microposts.find_by(id: params[:id])
      redirect_to root_url if @micropost.nil?
    end
end

自分で試したこと

heroku logs --tailコマンドでherokuのログを確認してみたら、下記の内容が表示されました。

(省略)

2022-07-07T21:17:23.363913+00:00 heroku[router]: at=info method=GET path="/microposts/304" host=pure-shore-72426.herokuapp.com request_id=e43ab7da-b5d7-47e2-8c91-49ec62d270de fwd="157.107.74.3" dyno=web.1 connect=0ms service=2ms status=404 bytes=1966 protocol=https

(省略)
0

3Answer

本番環境で投稿した内容を削除しようとすると

The page you were looking for doesn't exist.

が表示されるということですが、まずどういうURLにアクセスしててそのエラーが出るのかとかも全く分からない(ブラウザの画像からも読めない)

method=GET path="/microposts/304" host=pure-shore-72426.herokuapp.com

というログがあるということなので

にGETでアクセスした場合と考えると ...

routes.rb
resources :microposts,          omly: [:create, :destroy]

これだと:showがないので( GET /microposts/id は普通はshowアクション)本番かどうか以前に表示できないのではないでしょうか?
ついでにshowのアクションメソッドもmicroposts_controller.rbにない。

0Like

Comments

  1. @k12da

    Questioner

    下記のようにリクエストを送信してURLへのアクセスを考えていました。
    ```/sample_app/config/routes.rb

    post '/microposts/:id', to: 'microposts#destroy'

    ```

    https://pure-shore-72426.herokuapp.com/microposts/304

    railsチュートリアルに従って記述しており、:showやshowアクションの記述をroutes.rbやmicroposts_controller.rbに記載する文言がなかったので追加してなかったです。
    https://railstutorial.jp/chapters/user_microposts?version=6.0#sec-destroying_microposts

    ※本番環境(ローカル)では、正常に投稿が削除されます。

下記のようにリクエストを送信してURLへのアクセスを考えていました。

routes.rb
post '/microposts/:id', to: 'microposts#destroy'

という事ですが、既にこう記述があるので不要ではないかなと思うのと

routes.rb
resources :microposts,          only: [:create, :destroy]

destroyはHTTPのGETPOSTメソッドでは通常実行しません。

$ rails routes | grep microposts

としてみて現在のroutesを確認してみてmicropostsのdestroyはGETではなくDELETEになってませんか?

0Like

Comments

  1. @k12da

    Questioner

    こちらが現在のroutesです。

    microposts POST
    /microposts(.:format)
    microposts#create
    micropost GET
    /microposts/:id(.:format)
    microposts#show
    DELETE /microposts/:id(.:format) microposts#destroy
  2. なので、GETで同じURLにアクセスしてもrouting errorになるのかなと思います
  3. @k12da

    Questioner

    destroyアクションを実行するには、postやgetではなく、下記のようにdeleteである必要があるのでしょうか?
    ```/sample_app/config/routes.rb
    delete '/microposts/:id', to: 'microposts#destroy'
    ```

    初歩的な質問ですみません。
    (ローカルでできていたので、本番環境でできないのがなぜなのかがわかりません)

Your answer might help someone💌