Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ActionView::Template::Error(nil:NilClass的未定义方法`tr';)_Ruby On Rails_Ruby_Heroku_Progressive Web Apps_Vapid - Fatal编程技术网

Ruby on rails ActionView::Template::Error(nil:NilClass的未定义方法`tr';)

Ruby on rails ActionView::Template::Error(nil:NilClass的未定义方法`tr';),ruby-on-rails,ruby,heroku,progressive-web-apps,vapid,Ruby On Rails,Ruby,Heroku,Progressive Web Apps,Vapid,我正在测试service worker rails gem,并使用乏味的私钥和公钥发送推送通知。我已经成功地在本地创建了推送通知,但当我部署到heroku时,应用程序在尝试转到推送通知页面时引发上述错误。错误如下: 75] Started GET "/push-simple/" for 69.253.120.203 at 2017-02-12 06:37:35 +0000 2017-02-12T06:37:35.339318+00:00 app[web.1]: [3d626b62-4

我正在测试service worker rails gem,并使用乏味的私钥和公钥发送推送通知。我已经成功地在本地创建了推送通知,但当我部署到heroku时,应用程序在尝试转到推送通知页面时引发上述错误。错误如下:

      75] Started GET "/push-simple/" for 69.253.120.203 at 2017-02-12 06:37:35 +0000
2017-02-12T06:37:35.339318+00:00 app[web.1]: [3d626b62-4c1b-41ca-aad3-fc653dc96b75] ActionView::Template::Error (undefined method `tr' for nil:NilClass
2017-02-12T06:37:35.333379+00:00 app[web.1]: [3d626b62-4c1b-41ca-aad3-fc653dc96b75]   Rendering pages/push-simple.html.erb within layouts/application
2017-02-12T06:37:35.332337+00:00 app[web.1]: [3d626b62-4c1b-41ca-aad3-fc653dc96b75] Processing by PagesController#show as HTML
2017-02-12T06:37:35.336377+00:00 app[web.1]: [3d626b62-4c1b-41ca-aad3-fc653dc96b75]   Rendered pages/push-simple.html.erb within layouts/application (2.8ms)
2017-02-12T06:37:35.336998+00:00 app[web.1]: [3d626b62-4c1b-41ca-aad3-fc653dc96b75] Completed 500 Internal Server Error in 4ms
2017-02-12T06:37:35.339281+00:00 app[web.1]: [3d626b62-4c1b-41ca-aad3-fc653dc96b75]   
2017-02-12T06:37:35.339490+00:00 app[web.1]: [3d626b62-4c1b-41ca-aad3-fc653dc96b75]     13: <script type="text/javascript">
2017-02-12T06:37:35.339320+00:00 app[web.1]: Did you mean?  try):
2017-02-12T06:37:35.339489+00:00 app[web.1]: [3d626b62-4c1b-41ca-aad3-fc653dc96b75]     11: </div>
2017-02-12T06:37:35.339489+00:00 app[web.1]: [3d626b62-4c1b-41ca-aad3-fc653dc96b75]     12: 
2017-02-12T06:37:35.339561+00:00 app[web.1]: [3d626b62-4c1b-41ca-aad3-fc653dc96b75] app/views/pages/push-simple.html.erb:14:in `_app_views_pages_push_simple_html_erb__2838769268823495646_39526220'
2017-02-12T06:37:35.339491+00:00 app[web.1]: [3d626b62-4c1b-41ca-aad3-fc653dc96b75]     15: </script>
2017-02-12T06:37:35.339491+00:00 app[web.1]: [3d626b62-4c1b-41ca-aad3-fc653dc96b75]     14:   var publicKey = new Uint8Array(<%= WebpushClient.public_key_bytes %>);
2017-02-12T06:37:35.339492+00:00 app[web.1]: [3d626b62-4c1b-41ca-aad3-fc653dc96b75]     16: <%= javascript_include_tag 'push-simple' %>
2017-02-12T06:37:35.339520+00:00 app[web.1]: [3d626b62-4c1b-41ca-aad3-fc653dc96b75]   
2017-02-12T06:37:35.339560+00:00 app[web.1]: [3d626b62-4c1b-41ca-aad3-fc653dc96b75] app/clients/webpush_client.rb:7:in `public_key_bytes'
75]于2017-02-12 06:37:35+0000开始获取69.253.120.203的“/push simple/”
2017-02-12T06:37:35.339318+00:00应用程序[web.1]:[3d626b62-4c1b-41ca-aad3-fc653dc96b75]操作视图::模板::错误(未定义nil的“tr”方法:NilClass
2017-02-12T06:37:35.333379+00:00应用程序[web.1]:[3d626b62-4c1b-41ca-aad3-fc653dc96b75]在布局/应用程序中呈现页面/push-simple.html.erb
2017-02-12T06:37:35.332337+00:00应用程序[web.1]:[3d626b62-4c1b-41ca-aad3-fc653dc96b75]页面控制器处理#显示为HTML
2017-02-12T06:37:35.336377+00:00应用程序[web.1]:[3d626b62-4c1b-41ca-aad3-fc653dc96b75]布局/应用程序中的呈现页面/push-simple.html.erb(2.8毫秒)
2017-02-12T06:37:35.336998+00:00应用程序[web.1]:[3d626b62-4c1b-41ca-aad3-fc653dc96b75]在4ms内完成了500个内部服务器错误
2017-02-12T06:37:35.339281+00:00应用程序[网站1]:[3d626b62-4c1b-41ca-aad3-fc653dc96b75]
2017-02-12T06:37:35.339490+00:00应用程序[网站1]:[3d626b62-4c1b-41ca-aad3-fc653dc96b75]13:
2017-02-12T06:37:35.339320+00:00应用程序[web.1]:你的意思是?试试看):
2017-02-12T06:37:35.339489+00:00应用程序[网站1]:[3d626b62-4c1b-41ca-aad3-fc653dc96b75]11:
2017-02-12T06:37:35.339489+00:00应用程序[网站1]:[3d626b62-4c1b-41ca-aad3-fc653dc96b75]12:
2017-02-12T06:37:35.339561+00:00应用程序[web.1]:[3d626b62-4c1b-41ca-aad3-fc653dc96b75]应用程序/views/pages/push simple.html
2017-02-12T06:37:35.339491+00:00应用程序[网站1]:[3d626b62-4c1b-41ca-aad3-fc653dc96b75]15:
2017-02-12T06:37:35.339491+00:00应用程序[web.1]:[3d626b62-4c1b-41ca-aad3-fc653dc96b75]14:var publicKey=new Uint8Array();
2017-02-12T06:37:35.339492+00:00应用程序[网站1]:[3d626b62-4c1b-41ca-aad3-fc653dc96b75]16:
2017-02-12T06:37:35.339520+00:00应用程序[网站1]:[3d626b62-4c1b-41ca-aad3-fc653dc96b75]
2017-02-12T06:37:35.339560+00:00应用程序[web.1]:[3d626b62-4c1b-41ca-aad3-fc653dc96b75]应用程序/clients/webpush_client.rb:7:in'public_key_bytes'
这是我的webpushclient,其中定义了无趣键:

  class WebpushClient
    def self.public_key
      ENV['VAPID_PUBLIC_KEY']
    end

    def self.public_key_bytes
      Base64.urlsafe_decode64(public_key).bytes
    end

    def self.private_key
      ENV['VAPID_PRIVATE_KEY']
    end

    # Send webpush message using subscription parameters
    #
    # @param message [String] text to encrypt
    # @param subscription_params [Hash<Symbol, String>]
    # @option subscription_params [String] :endpoint url to send encrypted message
    # @option subscription_params [Hash<Symbol, String>] :keys auth keys to send with message for decryption
    # @return true/false
    def send_notification(message, endpoint: "", p256dh: "", auth: "")
      raise ArgumentError, ":endpoint param is required" if endpoint.blank?
      raise ArgumentError, "subscription :keys are missing" if p256dh.blank? || auth.blank?

      Rails.logger.info("Sending WebPush notification...............")
      Rails.logger.info("message: #{message}")
      Rails.logger.info("endpoint: #{endpoint}")
      Rails.logger.info("p256dh: #{p256dh}")
      Rails.logger.info("auth: #{auth}")

      Webpush.payload_send \
        message: message,
        endpoint: endpoint,
        p256dh: p256dh,
        auth: auth,
        vapid: {
          subject: "jon.corrin@gmail.com",
          public_key: public_key,
          private_key: private_key
        }
    end

    def public_key
      self.class.public_key
    end

    def private_key
      self.class.private_key
    end
  end
class-WebpushClient
def self.public_密钥
ENV['VAPID_PUBLIC_KEY']
结束
def self.public_key_字节
Base64.urlsafe\u decode64(公钥)。字节
结束
def self.private_密钥
ENV['VAPID_PRIVATE_KEY']
结束
#使用订阅参数发送webpush消息
#
#@param message[String]要加密的文本
#@param subscription_params[Hash]
#@option subscription_params[String]:发送加密消息的端点url
#@option subscription_params[Hash]:密钥要与解密消息一起发送的身份验证密钥
#@return-true/false
def发送通知(消息,端点:“”,p256dh:,身份验证:“”)
如果endpoint.blank,则引发ArgumentError“:endpoint param是必需的”?
如果p256dh.blank?| | auth.blank,则引发ArgumentError,“订阅:密钥丢失”?
Rails.logger.info(“发送WebPush通知…”)
Rails.logger.info(“消息:{message}”)
info(“端点:{endpoint}”)
Rails.logger.info(“p256dh:#{p256dh}”)
Rails.logger.info(“auth:{auth}”)
Webpush.payload\u发送\
讯息:讯息,,
端点:端点,
p256dh:p256dh,
auth:auth,
乏味的:{
主题:“乔恩。corrin@gmail.com",
公钥:公钥,
私钥:私钥
}
结束
def公钥
self.class.public_密钥
结束
def私钥
self.class.private_密钥
结束
结束
下面是我用来调用公钥的脚本:

<script type="text/javascript">
  var publicKey = new Uint8Array(<%= WebpushClient.public_key_bytes %>);
</script>
<%= javascript_include_tag 'push-react' %>

var publicKey=new Uint8Array();

就像我之前说的,它在本地工作。我想我可能忘记定义变量了,我看过类似的帖子,已经调试了很长一段时间,但是没有运气。有什么建议吗?我还想补充一点,我很新,所以如果这是一个明显的错误,我会完全理解的。

你的错误来自这个方法:

def self.public_key_bytes
  Base64.urlsafe_decode64(public_key).bytes
end
查找时,定义如下:

def urlsafe_decode64(str)
  strict_decode64(str.tr("-_", "+/"))
end
def self.public_key
  ENV['VAPID_PUBLIC_KEY']
end
这就是nil:NilClass的
未定义方法“tr”必须来自
public\u key
。您通过以下方式定义了该方法:

def urlsafe_decode64(str)
  strict_decode64(str.tr("-_", "+/"))
end
def self.public_key
  ENV['VAPID_PUBLIC_KEY']
end

…换句话说,您没有在生产服务器上设置环境变量。这就是为什么它在本地工作,但在生产服务器上不工作。

您的错误来自此方法:

def self.public_key_bytes
  Base64.urlsafe_decode64(public_key).bytes
end
查找时,定义如下:

def urlsafe_decode64(str)
  strict_decode64(str.tr("-_", "+/"))
end
def self.public_key
  ENV['VAPID_PUBLIC_KEY']
end
这就是nil:NilClass
未定义方法“tr”必须来自
public\u key
。您通过以下方式定义了该方法:

def urlsafe_decode64(str)
  strict_decode64(str.tr("-_", "+/"))
end
def self.public_key
  ENV['VAPID_PUBLIC_KEY']
end

…换句话说,您没有在生产服务器上设置环境变量。这就是为什么它在本地工作,但在生产服务器上不工作。

您一针见血。非常感谢Tom!顺便说一句,您可以通过更清楚地显示此错误消息来改进代码(也就是说,如果你再次犯同样的错误,让它给你一个更有用的错误消息!)将定义
public_key
方法,类似这样:
ENV['VAPID_public_key']| raise“未设置VAPID API key”
你一针见血。非常感谢Tom!顺便说一句,一种可能的方法是定义
public_key
方法如下:
ENV['VAPID_public_key']| raise“没有设置Vapid API键”