【问题标题】:Rails Amazon S3 uploader - undefined method `url' for nil:NilClassRails Amazon S3 上传器 - nil:NilClass 的未定义方法“url”
【发布时间】:2014-11-10 10:30:28
【问题描述】:

我按照 Heroku 的文章为我的 Rails 应用程序创建 Direct to S3 文件上传器。 https://devcenter.heroku.com/articles/direct-to-s3-image-uploads-in-rails

我做了教程所说的一切,但我用咖啡脚本编写了js。 (我也把它转换成纯JS并测试了,但我仍然遇到以下问题:

我的 JS 没有拾取为亚马逊预签名帖子创建的对象。

在我的控制器中,在 new 下是:

@s3_direct_post = S3_BUCKET.presigned_post(
  key: "#{SecureRandom.uuid}/${filename}", 
  success_action_status: 201, 
  acl: :public_read
)

这段代码看起来不错,与文章所说的完全一样。问题出在我的 projects.coffee.erb 中,如下:

formData: '<%= @s3_direct_post.fields.to_json.html_safe %>'

结果:

undefined method `url' for nil:NilClass

我的控制器中的代码应该创建 @s3_direct_post 对象,但我的 JS 没有选择它。执行时:Rails 控制台中的 @s3_direct_post 从 better_errors/binding_of_caller gems 中,对象仍然是 nil。

我在这里缺少什么吗? JS是在对象创建之前执行的吗?

【问题讨论】:

    标签: ruby-on-rails amazon-s3 coffeescript


    【解决方案1】:

    正是JS插入到HTML之前,它具有实例变量的值。由于预编译,您也不应该在资产管道中使用实例变量。

    如果你直接在你的 html 中插入该代码,你可以做到这一点

    <script>
     ...
     formData: '<%= @s3_direct_post.fields.to_json.html_safe %>'
     ...
    </script>
    

    也许可以删除另一种解决方案

    //= require_tree .
    

    从 application.js 并将布局中 js 的负载更改为:

    <%= javascript_include_tag "application", controller_name %>
    

    但您需要将@s3_direct_post 的负载更改为控制器中的前置过滤器功能

    【讨论】:

    • 谢谢,我不得不将 JS 内联到我的 HAML 中,我通常不喜欢这样做,但在这种情况下必须这样做。再次感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2017-06-06
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多