我正在使用carrierwave直接将用户头像保存到S3。我已经启动并运行了示例应用程序,但是在创建用户时不想保存头像,我希望能够在编辑用户时添加头像。
我已经对头像控制器中的新方法进行了此更改 -
class AvatarsController < ApplicationController
def new
@user = User.find_by_id(params[:user_id])
@uploader = @user.avatar
@uploader.success_action_redirect = @user
end
end
...已将:user_id作为link_to方法中的参数传递。
这会扰乱S3 -
<Error>
<Code>InvalidPolicyDocument</Code>
<Message>Invalid Policy: Invalid JSON.</Message>
<RequestId>B1546F83A39ABF39</RequestId>
<HostId>
U5vaOy0bh+Zsgb3hKM24PNZvZ7+sh/ntJMJZUmcZ/5uQZIIfzxEDqeymHCO8JJ6w
</HostId>
</Error>
有没有人就如何找到问题的根源提出任何建议?
答案 0 :(得分:1)
我已经有一段时间了,因为我直接使用了carrierwave,但希望这会让你指向正确的方向。
首先,了解在您的视图中调用direct_upload_form_for
期间,carrierwave direct会为您生成POST policy。
使用HTTP POST进行身份验证请求所需的策略是使用JavaScript Object Notation(JSON)编写的UTF-8和Base64编码文档,该文档指定请求必须满足的条件。
因此,如果您想关注代码,您会发现CarrierWaveDirect::ActionViewExtensions::FormHelper定义direct_upload_form_for
,其中form_for
调用CarrierWaveDirect::FormBuilder
,将builder
作为required_base_fields
传递。< / p>
查看CarrierWaveDirect::FormBuilder,我们可以看到函数policy
定义了包含在表单中的隐藏字段。我们特别感兴趣的是policy
。
generate_policy
的值来自CarrierWaveDirect::Uploader中的同名函数,该函数将其大部分工作委托给私有函数direct_upload_form_for
。请注意,它正在创建Base64编码的JSON,正如POST策略所要求的那样。
考虑到所有这些,您可以检查视图中policy
生成的HTML,并获取名为Base64.decode64
的隐藏输入的值。然后你可以解码那个值(可能在rails控制台中使用{{1}})并获得人类可读的JSON。
使用原始JSON,您现在可以将发送到S3的内容与POST策略的规范进行比较,并且在 all 的上下文中发送到s3的数据,您应该是能够进一步调试。