在用户编辑时添加头像

时间:2015-02-19 16:48:12

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

我正在使用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>

有没有人就如何找到问题的根源提出任何建议?

1 个答案:

答案 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的数据,您应该是能够进一步调试。