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

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

ただいまの
回答率

90.99%

  • Ruby on Rails

    6221questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Heroku

    633questions

    HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

  • LINE Messaging API

    97questions

【Rails】「 render :nothing => true 」 が効かない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 374

shi6na

score 3

rails、herokuを用いてLINEBOTを作成しようとしております。
heroku run rails consoleをすると正常に動くのですが、実際にLINEで話し掛けると
どうも上手くいかないためherokuにてログを参照したところ、以下のようなActionViewエラーが出ます。

Completed 500 Internal Server Error in 8ms
ActionView::MissingTemplate (Missing template webhook/callback, application/callback with {:locale=>[:en], :formats=>[:html, :text, :js, :css, :ics, :csv, :vcf, :png, :jpeg, :gif, :bmp, :tiff, :svg, :mpeg, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip, :gzip], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in:
 * "/app/app/views"
):
app/controllers/webhook_controller.rb:10:in `callback'

callbackアクションに対して表示するviewがないよ!と言ってそうな気がしますが、webhookコントローラー内callbackアクションにて「render :nothing => true」で何も表示しないと指定しています。
その後の「application/callback」がミソのような気がしますが、applicationコントローラーにはcallbackアクションは無い・・・と、ここで詰まっております。
「render :nothing => true」が効かない条件がコントローラー内にあるのでしょうか?
また、「app/controllers/webhook_controller.rb:10:in `callback'」もヒントになるような気はするのですが、わからずじまいです。(webhookコントローラーの10行目にrender :nothing => trueを書いてる)

(追記)もしかしてcallback内に「render :nothing => true」が2つあるのが問題かと思いましたが、and returnを入れても変化なかったので違いそうです。

以下にherokuのログと、コントローラー(webhook_controller.rb)、routes.rbのコードを投げておきます。 (コントローラーはこちらを参考にしております(https://qiita.com/YoheiMiyamoto/items/f6851cdb40891edf0e57))

class WebhookController < ApplicationController
  protect_from_forgery except: :callback

  CHANNEL_SECRET = ENV['CHANNEL_SECRET']
  OUTBOUND_PROXY = ENV['OUTBOUND_PROXY']
  CHANNEL_ACCESS_TOKEN = ENV['CHANNEL_ACCESS_TOKEN']

  def callback
    unless is_validate_signature
      render :nothing => true, status: 470
    end

    event = params["events"][0]
    event_type = event["type"]
    replyToken = event["replyToken"]

    case event_type
    when "message"
      input_text = event["message"]["text"]
      output_text = input_text
    end

    client = LineClient.new(CHANNEL_ACCESS_TOKEN, OUTBOUND_PROXY)
    res = client.reply(replyToken, output_text)

    if res.status == 200
      logger.info({success: res})
    else
      logger.info({fail: res})
    end

    render :nothing => true, status: :ok
  end

  private
  # verify access from LINE
  def is_validate_signature
    signature = request.headers["X-LINE-Signature"]
    http_request_body = request.raw_post
    hash = OpenSSL::HMAC::digest(OpenSSL::Digest::SHA256.new, CHANNEL_SECRET, http_request_body)
    signature_answer = Base64.strict_encode64(hash)
    signature == signature_answer
  end
end
#routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html

  post '/callback' => 'webhook#callback'

end
2017-10-10T12:52:52.629674+00:00 app[web.1]: [b6566130-8446-4c9b-8b6c-b6d653fb0c07] Started POST "/callback" for 203.104.156.75 at 2017-10-10 12:52:52 +0000
2017-10-10T12:52:52.634068+00:00 app[web.1]: [b6566130-8446-4c9b-8b6c-b6d653fb0c07] Processing by WebhookController#callback as HTML
2017-10-10T12:52:52.634233+00:00 app[web.1]: [b6566130-8446-4c9b-8b6c-b6d653fb0c07]   Parameters: {"events"=>[{"replyToken"=>"***", "type"=>"message", "timestamp"=>***, "source"=>{"type"=>"user", "userId"=>"***"}, "message"=>{"id"=>"***", "type"=>"text", "text"=>"Hello, world"}}, {"replyToken"=>"***", "type"=>"message", "timestamp"=>***, "source"=>{"type"=>"user", "userId"=>"***"}, "message"=>{"id"=>"***", "type"=>"sticker", "packageId"=>"1", "stickerId"=>"1"}}], "webhook"=>{"events"=>[{"replyToken"=>"***", "type"=>"message", "timestamp"=>***, "source"=>{"type"=>"user", "userId"=>"***"}, "message"=>{"id"=>"***", "type"=>"text", "text"=>"Hello, world"}}, {"replyToken"=>"***", "type"=>"message", "timestamp"=>***, "source"=>{"type"=>"user", "userId"=>"***"}, "message"=>{"id"=>"***", "type"=>"sticker", "packageId"=>"1", "stickerId"=>"1"}}]}}
2017-10-10T12:52:52.642587+00:00 app[web.1]: [b6566130-8446-4c9b-8b6c-b6d653fb0c07] Can't verify CSRF token authenticity.
2017-10-10T12:52:52.644502+00:00 app[web.1]: [b6566130-8446-4c9b-8b6c-b6d653fb0c07] Completed 500 Internal Server Error in 10ms
2017-10-10T12:52:52.645073+00:00 app[web.1]: [b6566130-8446-4c9b-8b6c-b6d653fb0c07]   
2017-10-10T12:52:52.645114+00:00 app[web.1]: [b6566130-8446-4c9b-8b6c-b6d653fb0c07] ActionView::MissingTemplate (Missing template webhook/callback, application/callback with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in:
2017-10-10T12:52:52.645116+00:00 app[web.1]:   * "/app/app/views"
2017-10-10T12:52:52.645162+00:00 app[web.1]: [b6566130-8446-4c9b-8b6c-b6d653fb0c07]   
2017-10-10T12:52:52.645116+00:00 app[web.1]: ):
2017-10-10T12:52:52.645209+00:00 app[web.1]: [b6566130-8446-4c9b-8b6c-b6d653fb0c07] app/controllers/webhook_controller.rb:10:in `callback'
2017-10-10T12:53:32.725642+00:00 heroku[router]: at=info method=POST path="/callback" host=***.herokuapp.com request_id=f8695c6b-0fc7-44a7-966a-65b353dcf3d2 fwd="203.104.146.154" dyno=web.1 connect=1ms service=16ms status=500 bytes=1827 protocol=https
2017-10-10T12:53:32.711833+00:00 app[web.1]: [f8695c6b-0fc7-44a7-966a-65b353dcf3d2] Started POST "/callback" for 203.104.146.154 at 2017-10-10 12:53:32 +0000
2017-10-10T12:53:32.713687+00:00 app[web.1]: [f8695c6b-0fc7-44a7-966a-65b353dcf3d2] Processing by WebhookController#callback as */*
2017-10-10T12:53:32.713835+00:00 app[web.1]: [f8695c6b-0fc7-44a7-966a-65b353dcf3d2]   Parameters: {"events"=>[{"type"=>"message", "replyToken"=>"***", "source"=>{"userId"=>"***", "type"=>"user"}, "timestamp"=>***, "message"=>{"type"=>"text", "id"=>"***", "text"=>"ぼー"}}], "webhook"=>{"events"=>[{"type"=>"message", "replyToken"=>"***", "source"=>{"userId"=>"***", "type"=>"user"}, "timestamp"=>***, "message"=>{"type"=>"text", "id"=>"***", "text"=>"ぼー"}}]}}
2017-10-10T12:53:32.714357+00:00 app[web.1]: [f8695c6b-0fc7-44a7-966a-65b353dcf3d2] Can't verify CSRF token authenticity.
2017-10-10T12:53:32.720612+00:00 app[web.1]: [f8695c6b-0fc7-44a7-966a-65b353dcf3d2] Completed 500 Internal Server Error in 7ms
2017-10-10T12:53:32.721551+00:00 app[web.1]: [f8695c6b-0fc7-44a7-966a-65b353dcf3d2]   
2017-10-10T12:53:32.721607+00:00 app[web.1]: [f8695c6b-0fc7-44a7-966a-65b353dcf3d2] ActionView::MissingTemplate (Missing template webhook/callback, application/callback with {:locale=>[:en], :formats=>[:html, :text, :js, :css, :ics, :csv, :vcf, :png, :jpeg, :gif, :bmp, :tiff, :svg, :mpeg, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip, :gzip], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. Searched in:
2017-10-10T12:53:32.721609+00:00 app[web.1]:   * "/app/app/views"
2017-10-10T12:53:32.721610+00:00 app[web.1]: ):
2017-10-10T12:53:32.721635+00:00 app[web.1]: [f8695c6b-0fc7-44a7-966a-65b353dcf3d2]   
2017-10-10T12:53:32.721685+00:00 app[web.1]: [f8695c6b-0fc7-44a7-966a-65b353dcf3d2] app/controllers/webhook_controller.rb:10:in `callback'

(補足)herokuログに「Can't verify CSRF token authenticity.」とありますが、CSRFエラーの方は解決しております。

protect_from_forgery except: :callback


でcallbackをよけてあげると通りました。
コードの方は修正してあります。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/01 16:50

    反応遅くなってしまいすみません。URL参考に色々調べまして、
    「render :nothing => true(略)」(二箇所)をそれぞれ「head 470」「head :ok」に 変更してみたところ、無事にできました…!!!
    rails5.1から:nothingオプション使えないんですね…なるほど…
    ありがとうございます!!

    キャンセル

  • 2017/11/06 16:06

    たまたま最近同じこと調べたばかりだったんで^^
    解決して良かったです。

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る

  • Ruby on Rails

    6221questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Heroku

    633questions

    HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

  • LINE Messaging API

    97questions