2015-02-19 3 views
1

Я использую carrierwave direct для сохранения аватара пользователя на S3. У меня есть пример приложения и работает, но вместо сохранения аватара при создании пользователя я хочу иметь возможность добавлять аватар, когда пользователь редактируется.Добавление аватара на пользователя edit

Я сделал это изменение нового метода в контроллере аватара -

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

Прошло некоторое время с тех пор, как я вращался с несущей волной, но, надеюсь, это заставит вас указывать в правильном направлении.

Прежде всего, поймите, что carrierwave direct создает для вас POST policy во время разговора с номером direct_upload_form_for.

Политика, требуемая для получения аутентифицированных запросов с использованием HTTP POST, представляет собой кодированный документ UTF-8 и Base64, написанный в JavaScript Object Notation (JSON), который определяет условия, которые должен удовлетворять запрос.

Так что, если вы хотите следовать код, вы увидите, что CarrierWaveDirect::ActionViewExtensions::FormHelperdirect_upload_form_for определяет, что вызывает form_for, передавая CarrierWaveDirect::FormBuilder в builder.

Глядя на CarrierWaveDirect::FormBuilder, мы видим, что функция required_base_fields определяет скрытые поля, которые входят в форму. В частности, нас интересует policy.

Значение policy происходит от имени функции с таким же именем в диапазоне CarrierWaveDirect::Uploader, что делает большую часть своей работы частной функции generate_policy. Обратите внимание, что он создает JSON с кодировкой Base64, точно так же, как требует политика POST.

Имея это в виду, вы можете проверить HTML, сгенерированный direct_upload_form_for, в представлении и получить значение скрытого ввода с именем policy. Затем вы можете декодировать это значение (возможно, с Base64.decode64 в консоли rails) и получить JSON для чтения человеком.

Вооруженных с сыром JSON, теперь вы можете сравнить то, что вы отправляете S3 с спецификацией политики POST, и в контексте всех данных, передаваемый в s3, вы должны быть в состоянии отладки дальше ,

+0

Спасибо - это действительно полезное направление. Я собираюсь работать через него, а затем добавить полное решение вашего ответа, если вы тоже счастливы за меня. – RADan

+0

Рад, что я мог бы помочь, не стесняйтесь добавлять к моему ответу, если считаете, что это уместно. – ihaztehcodez

+0

Что вы выяснили? – Overload119

Смежные вопросы