2015-10-24 3 views
0

У меня есть модель института, которая имеет атрибут изображения. Я использую несущую для загрузки изображений.Невозможно добавить изображения с помощью несущей волны в Devise resistration

class Institute < ActiveRecord::Base 
    mount_uploader :picture, PictureUploader 
end 

PictureUploader для carrierwave

class PictureUploader < CarrierWave::Uploader::Base 
    include CarrierWave::MiniMagick 
    process resize_to_limit: [400, 400] 
    storage :file 
end 

формы DEViSE для загрузки изображения

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put , multipart: true }) do |f| %> 
    <%= f.file_field :picture,accept: 'image/jpeg,image/gif,image/png' %> 
<% end %> 

миграции

add_column :institutes, :picture, :string 

Сильные параметры обрабатываются в контроллере приложения с

class Institute::ParameterSanitizer < Devise::ParameterSanitizer 
    def sign_up 
     default_params.permit(:email,:password,:password_confirmation,:picture) 
    end 
    end 

Но когда я его сохраню, изображение не сохраняется. Я понятия не имею, где это происходит. Атрибут изображения сохраняется. но

institute.picture.url => nil 

Я долгое время проводил это, но не могу понять, почему это происходит. Есть ли способ отладки? Ожидание некоторых решений. Спасибо ..

Started PUT "/institutes" for 127.0.0.1 at 2015-10-25 00:06:27 +0530 
Processing by Devise::RegistrationsController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"EoILK8UjrjjLfyxnFu6ozlqmfHDb/D9fp7CTmLHEjjr5i9h9ZaHGrkG4e5WUhVHMc/jirgu7+vSyH+bRrqWRAg==", "institute"=>{"email"=>"[email protected]", "name"=>"RajeevIn", "phone_no"=>"555555", "address"=>"", "description"=>"", "picture"=>#<ActionDispatch::Http::UploadedFile:0x00000003e34178 @tempfile=#<Tempfile:/tmp/RackMultipart20151025-28776-o2ywzl.jpg>, @original_filename="12redroses_silk.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"institute[picture]\"; filename=\"12redroses_silk.jpg\"\r\nContent-Type: image/jpeg\r\n">, "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "current_password"=>"[FILTERED]"}, "commit"=>"Update"} 
    Institute Load (0.6ms) SELECT "institutes".* FROM "institutes" WHERE "institutes"."id" = $1 ORDER BY "institutes"."id" ASC LIMIT 1 [["id", 1]] 
    Institute Load (0.4ms) SELECT "institutes".* FROM "institutes" WHERE "institutes"."id" = $1 LIMIT 1 [["id", 1]] 
Unpermitted parameters: name, phone_no, address, description, picture 
    (0.2ms) BEGIN 
    (0.2ms) COMMIT 

institute.picture? метод, предоставляемый carrierwave дает false ложна, даже если institue.picture существует.

+0

некоторые бревна рельсы, пожалуйста? – CuriousMind

+0

бревна, добавленные выше. – raj

ответ

0

похоже, что вы выполняете действие по обновлению, но являетесь белым списком для регистрации. так изменить класс ParameterSanitizer к этому:

class Institute::ParameterSanitizer < Devise::ParameterSanitizer 
    def sign_up 
     default_params.permit(:email,:password,:password_confirmation,:picture) 
    end 

    def account_update 
    default_params.permit(:email,:password,:password_confirmation,:picture) 
    end 
    end 

Вы можете добавить это (если это еще не сделано)

class ApplicationController < ActionController::Base 
    before_action :configure_permitted_parameters, if: :devise_controller? 

    protected 

    def devise_parameter_sanitizer 
    if resource_class == Institute 
     Institute::ParameterSanitizer.new(Institute, :institute, params) 
    else 
     super # Use the default one 
    end 
    end 
end 

После этой линии Unpermitted parameters: name, phone_no, address, description, picture не должны появляться в журналах. если он все еще появляется, то это означает, что «белый список» параметров не вступил в силу. В этом случае, пожалуйста, поделитесь примером приложения, которое воспроизводит эту проблему в github, я помогу вам исправить это.

+0

Это был тот. Спасибо. но почему институт. картинка не ноль? – raj

+0

Так работает API. 'институт.picture' является методом несущей, поэтому он не ведет себя как другие атрибуты AR. Следовательно, это никогда не будет 'nil'. Вы должны использовать методы, заданные carreriwave, чтобы проверить, было ли картинка нулевой или нет. например, 'picture.file.exists?' должно быть ложным, если изображение не существует. Надеюсь, поможет! – CuriousMind

+0

Большое спасибо .. Havnt достиг 15 репутации. В противном случае было бы поддержано. – raj

0

Некоторые способы, чтобы проверить это:

  • убедитесь, что вы используете сохранить! так, чтобы он выдавал исключение, если оно не сохраняется.
+0

Как я могу убедиться, что несущая волна загружена после ORM? – raj

+0

никогда, в рельсах, что происходит автоматически. – ekhaliki

+0

Сохраняется ли файл? Попробуйте проверить базу данных, чтобы увидеть, существует ли файл после сохранения! – ekhaliki

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