質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

いいね!ボタンを押すと謎のエラーメッセージが出現します

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,953

ninpig04

score 31

エラーメッセージ内容
PostsController#show is missing a template for this request format and variant. request.formats: ["text/html"] request.variant: [] NOTE! For XHR/Ajax or API requests, this action would normally respond with 204 No Content: an empty white screen. Since you're loading it in a web browser, we assume that you expected to actually render a template, not nothing, so we're showing an error to be extra-clear. If you expect 204 No Content, carry on. That's what you'll get from an XHR or API request. Give it a shot.

"That's what you'll get from an XHR or API request. Give it a shot."

        raise ActionController::UnknownFormat, message
      else
        logger.info "No template found for #{self.class.name}\##{action_name}, rendering head :no_content" if logger
        super

いいね!ボタンを押すとこのようなエラーメッセージが出ます。
ページを戻してリロードするといいね!ボタンが押したことはセーブされているので、あとは元のページに戻ってくれれば・・・と思うのですが、何が問題なのでしょうか?
自分では解決できませんでした。。。
よろしくお願いします。

以下の情報を追記してもらえますか。①config/routes.rb,②「いいね」を押したときのリクエスト(ログファイルもしくは rails server したターミナルから拾う),③「いいね」を押したときのアクションのメソッド,④posts#show アクションのメソッド,⑤posts#show アクションに対応するビューのテンプレートのパス

Rails.application.routes.draw do

  post "likes/:post_id/create" => "likes#create"
  post "likes/:post_id/destroy" => "likes#destroy"

  get "posts/index" => "posts#index"
  get "posts/new" => "posts#new"
  get "posts/:id" => "posts#show"
  post "posts/create" => "posts#create"


  get 'comments/index'
  get 'comments/:id' => 'comments#show'





    root   'static_pages#home'
    get    '/help',    to: 'static_pages#help'
    get    '/configuration',    to: 'static_pages#configuration'
    get    '/about',   to: 'static_pages#about'
    get    '/contact', to: 'static_pages#contact'
    get    '/top', to: 'static_pages#top'
    get    '/signup',  to: 'users#new'
    get    '/login',   to: 'sessions#new'
    post   '/login',   to: 'sessions#create'
    delete '/logout',  to: 'sessions#destroy'

    get '/:city/:banti', to: 'comments#index'



    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,          only: [:create, :destroy]
    resources :relationships,       only: [:create, :destroy]
end

いいねを押した時のアクション

class LikesController < ApplicationController

def index
    end

  def create
    @like = Like.new(user_id: @current_user.id, post_id: params[:post_id])
    @like.save
    redirect_to("/posts/#{params[:post_id]}")
  end


  def destroy
    @like = Like.find_by(user_id: @current_user.id, post_id: params[:post_id])
    @like.destroy
    redirect_to("/posts/#{params[:post_id]}")
  end

end


posts#showのメソッド(いいねのページはCommentsのshowです)

  def show
        @post = Post.find_by(id: params[:id])
        @likes_count = Like.where(post_id: @post.id).count
    end

パスは
app/views/posts/show.html.erbです

ちなみに、comments#showのメソッドは

class CommentsController < ApplicationController


    def show
        @comments = Comment.find_by(id: params[:id])
        @posts = Post.where(comment_id: @comment.id)
        @current_user = User.find_by(id: session[:user_id])
        @post = Post.find_by(id: params[:id])
        @likes_count = Like.where(post_id: @post.id).count
    end
end

です

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • scivola

    2018/02/14 01:09

    「いいね」はコメントに対する「いいね」じゃなくて,Post に対する「いいね」なんですよね? それで,「いいね」したあと comments#show を表示する,というのがよくわからないですが。

    キャンセル

  • ninpig04

    2018/02/14 02:00

    ごめんなし、しっかり確認できていませんでした。。。。 likes_controllerの中にあるcreateアクションとdestroyアクションは実行した後/posts/#{params[:post_id]}にリダイレクトされるように記述しましたが、comments/:idにリダイレクトしたいのです。しかしこれを実行すると、このページは動作していません localhost から無効な応答が送信されました。 ERR_INVALID_REDIRECTと表示されてしまいます。

    キャンセル

  • ninpig04

    2018/02/14 02:02

    postのフォームはcomments/showのページに存在しています。また、そこにPostモデルで取り出した投稿データを一覧にして表示しています。そこLike_controllerを使っていいねをつけたり消したりしたりできるようにしているのです。

    キャンセル

回答 1

checkベストアンサー

0

ruby詳しいわけではないですが、エラーメッセージ読んだら割と簡単なことのように思います。

  PostsController#showには、このリクエストフォーマットとバリアントのテンプレートがありません。 request.formats:["text / html"] request.variant:[]注意! XHR / AjaxまたはAPIリクエストの場合、このアクションは通常、No Content:空の白い画面で応答します。 Webブラウザで読み込んでいるので、実際にテンプレートをレンダリングすることを想定していると想定していますので、余分なエラーを表示しています。 あなたが204のコンテンツを期待するなら、続けてください。 それがXHRまたはAPIリクエストから得られるものです。 試してみます。

*Google翻訳

非同期通信でコントローラ利用してhtmlとして出力する必要がなくてもきちんと空白でもビューを用意しろってことですかね。たぶん。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/14 00:56

    postsのshowのビューを作ったらうまく行きました!
    しかし、いいね!ボタンを押して元のcommentsのshowに戻るようにしたいのですが、そうするとリダイレクトエラーと表示されてエラーが出てしまいます。これはなぜでしょうか?

    キャンセル

  • 2018/02/14 06:22

    非同期通信のビューはあくまで通信処理結果のみ(例えば成功・失敗のみ)であってリダイレクト先htmlであってはいけません。
    例えば「1」とだけ出力するビューを用意するだけではないかと思いますよ。
    そのビューは元々の画面と同じであってはいけないように思います(いいねボタンで同期POSTする場合はこの限りではありません)
    html部分、javascript部分などビュー側のソースも提示された方がより的確な回答を得られるかと思います。
    (あと、「ruby 非同期通信」とか「ruby ajax」とかで調べるとか)

    キャンセル

  • 2018/02/14 08:22

    Ajax 使ってます? エラーメッセージ中に Ajax に関する記述がありますが,ninpig04 さんのコードでは Ajax は使ってませんよね?

    キャンセル

  • 2018/02/14 09:25

    scivolaさん
    あ、確かにそうですね。エラー文の「XHR / Ajax」というところから非同期→ajaxを利用していると解釈していました。失礼しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる