2015-12-31 2 views
2

Я пытаюсь сделать приложение в Rails 4.Rails 4 - Carrierwave -file загружает

Я использую Carrierwave для загрузки файлов.

У меня есть две модели, пользователь & профиль.

каждого из них:

profile.rb

mount_uploader :hero, HeroUploader 

user.rb

mount_uploader :avatar, AvatarUploader 

Я тогда добавлявшие как:

Hero:

class HeroUploader < CarrierWave::Uploader::Base 

    # Include RMagick or MiniMagick support: 
    # include CarrierWave::RMagick 
    include CarrierWave::MiniMagick 

    # Choose what kind of storage to use for this uploader: 
    storage :file 
    # storage :fog 

    # Override the directory where uploaded files will be stored. 
    # This is a sensible default for uploaders that are meant to be mounted: 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 

    # Provide a default URL as a default if there hasn't been a file uploaded: 
    # def default_url 
    # # For Rails 3.1+ asset pipeline compatibility: 
    # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_')) 
    # 
    # "/images/fallback/" + [version_name, "default.png"].compact.join('_') 
    # end 

    # Process files as they are uploaded: 
    process :resize_to_fit => [950, 245] 
    # process :scale => [200, 300] 
    # 
    # def scale(width, height) 
    # # do something 
    # end 

    # Create different versions of your uploaded files: 
    version :wide do 
    process :resize_to_fill => [951,245] 
    end 

    # Add a white list of extensions which are allowed to be uploaded. 
    # For images you might use something like this: 
    def extension_white_list 
    %w(jpg jpeg gif png) 
    end 

    # Override the filename of the uploaded files: 
    # Avoid using model.id or version_name here, see uploader/store.rb for details. 
    # def filename 
    # "something.jpg" if original_filename 
    # end 

end 

Аватар:

class AvatarUploader < CarrierWave::Uploader::Base 

    # Include RMagick or MiniMagick support: 
    # include CarrierWave::RMagick 
    include CarrierWave::MiniMagick 

    # Choose what kind of storage to use for this uploader: 
    storage :file 
    # storage :fog 

    # Override the directory where uploaded files will be stored. 
    # This is a sensible default for uploaders that are meant to be mounted: 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 

    def cache_dir 
    "#{Rails.root}/tmp/uploads" 
    end 

    # Provide a default URL as a default if there hasn't been a file uploaded: 
    # def default_url 
    # # For Rails 3.1+ asset pipeline compatibility: 
    # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_')) 
    # 
    # "/images/fallback/" + [version_name, "default.png"].compact.join('_') 
    # end 

    # Process files as they are uploaded: 
    # process :scale => [200, 300] 
    # 
    # def scale(width, height) 
    # # do something 
    # end 

    # Create different versions of your uploaded files: 
    # version :thumb do 
    # process :resize_to_fit => [50, 50] 
    # end 

    process :resize_to_fit => [800, 800] 
    # Create different versions of your uploaded files: 
    version :thumb do 
    process :resize_to_fill => [200,200] 
    end 

    version :profile do 
    process :resize_to_fill => [345,245] 
    end 

    version :wide do 
    process :resize_to_fill => [951,245] 
    end 

    version :small do 
    process :resize_to_fill => [35,35] 
    end 


    # Add a white list of extensions which are allowed to be uploaded. 
    # For images you might use something like this: 
    def extension_white_list 
    %w(jpg jpeg gif png) 
    end 

    # Override the filename of the uploaded files: 
    # Avoid using model.id or version_name here, see uploader/store.rb for details. 
    # def filename 
    # "something.jpg" if original_filename 
    # end 

end 

Я все еще в режиме разработки (поэтому не уверен, если это имеет значение).

В моем профиле форме у меня есть:

<%= simple_form_for(@profile) do |f| %> 
      <%= f.error_notification %> 

       <div class="form-inputs"> 

      <div class="intpol2"> 
      About you 
      </div> 

      <div class="row"> 
      <div class="col-md-4"> 
       <%= f.input :title, autofocus: true %> 
      </div> 

      <div class="col-md-8"> 
       <%= f.input :occupation, :label => "Your occupation or job title" %> 
      </div> 

      </div> 

      <div class="row"> 
      <div class="col-md-6"> 
       <%= render 'users/profileimgform', f: f %> 
      </div> 

      <div class="col-md-6"> 
      <%= f.input :hero, as: :file, :label => "Add a background image to your profile page" %> 
      </div> 

      </div> 

И мой пользовательский частичный вид на профиль аватар имеет:

<%= simple_fields_for :user do |f| %> 
    <%= f.error_notification %> 

       <div class="form-inputs"> 


       <%= f.input :avatar, as: :file, :label => "Add a profile image (head shot)" %> 

       </div> 


     <% end %> 

Когда я сохраняю все это и попытаться использовать форму для загрузки Я получаю два разных результата.

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

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

Failed to load resource: the server responded with a status of 404 (Not Found) 

Есть еще один шаг, чтобы сделать эту работу?

Мой контроллер профиль имеет сильные Params, которые включают в себя оба этих атрибутов:

def profile_params 
     params[:profile].permit(:user_id, :title, :hero, :overview, :research_interest, :occupation, :external_profile, 
     :working_languages, :tag_list, 
      user_attributes: [:avatar] 
     ) 
    end 

Принимая предложение Алексея ниже, я изменил открытие линии профилей образуют в:

<%= simple_form_for @profile, html: { multipart: true } do |f| %> 

Когда я откладываю это и повторите попытку, я получаю точно такую ​​же ошибку, как и раньше.

В моих профилях показать страницу, у меня есть:

<%= image_tag '@profile.user.avatar.url.profile' if @profile.user.avatar? %> 

      <%= image_tag '@profile.hero.url.wide' if @profile.hero? %> %> 

Эти теги изображения находятся в одной и той же странице шоу. Атрибут аватара находится в таблице пользователей (профиль принадлежит пользователю), а атрибут hero - в таблице профилей. Разница в ошибках заключается в том, что тег div, содержащий аватар, просто отображается в инспекторе кода пустым. Тег div, содержащий изображение героя, отображается как неработающая ссылка и показывает ошибку 404 в инспекторе кода.

В моей статье показана страница. У меня такая же проблема, но вместо рендеринга изображения отображается типизированное имя файла изображения.

+0

Вам нужно добавить - многочастному: правда - в форму. –

+0

где я пишу это? – Mel

+0

<% = simple_form_for (@profile) do | f | %> См. Здесь для получения дополнительной информации: http://guides.rubyonrails.org/form_helpers.html#uploading-files –

ответ

1

Ваш код с многоголосных полностью рабочим, просто удалить кавычки в image_tag:

<%= image_tag @profile.user.avatar.profile.url if @profile.user.avatar? %> 

<%= image_tag @profile.hero.wide.url if @profile.hero? %> 
+0

Отлично. Спасибо, но размер магии изображения не работает undefined method 'wide 'для" /uploads/profile/hero/1/croppedplane.png":String – Mel

+0

@ user2860931 см. Update – Inpego

+0

Это ошибка 404, когда я добавляю широкое в это выражение (даже перед URL-адресом). Если я выберу это, он отобразит изображение, но без изменения его размера. – Mel

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