rails4.2.8 carrierwave + mini_magick + Jcrop, не удалось загрузить картинку - PullRequest
0 голосов
/ 12 мая 2018

Я использовал:

gem 'rails', '4.2.8'
gem 'carrierwave', '~> 1.2', '>= 1.2.2'
gem 'mini_magick', '~> 4.8'
gem 'Jcrop', '~> 0.1.0'

и ruby-2.5.0.

Мой picture_uploader.rb такой:

# encoding: utf-8

class PictureUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick

  storage :file

  def store_dir
    "uploaders/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Create different versions of your uploaded files:
  version :large do
    resize_to_limit(600, 600)
  end

  version :tiny, from_version: :thumb do
    process resize_to_fill: [32, 32]
  end

  version :thumb do
    process :crop
    resize_to_fill(100, 100)
  end

  def crop
    if model.crop_x.present?
      resize_to_limit(600, 600)
      manipulate! do |img|
        x = model.crop_x.to_i
        y = model.crop_y.to_i
        w = model.crop_w.to_i
        h = model.crop_h.to_i
        # [[w, h].join('x'),[x, y].join('+')].join('+') => "wxh+x+y"
        img.crop([[w, h].join('x'),[x, y].join('+')].join('+'))
      end
    end
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end

  def filename
    if original_filename
      @name ||= Digest::MD5.hexdigest(File.open(current_path, "rb") { |f| "#{f.read}" })
      "#{@name}.#{file.extension}"
    end
  end

end

А мой users_controller.rb такой:

def update
    @user = User.find(params[:id])
    if @user.update_attributes(user_params)
      if params[:user][:picture].present?
        render :crop
      else
        redirect_to @user
        flash[:success] = "Success updated"
      end
    else
      render :edit
    end
  end

private
  def user_params
    params.require(:user).permit(:name, :email, :phone, :password, :phoneMes, :picture, :crop_x, :crop_y, :crop_w, :crop_h, :password_confirmation)
  end

Мой show.html.erb вот так:

<%= form_for @user, :html => {:multipart => true} do |f| %>
  <p><%= f.label :name %></p>
  <p><%= f.file_field :picture  %></p>
  <p><%= f.submit %></p>
<% end %>

<%= image_tag @user.picture.url if @user.picture? %>

Мой crop.html.erb вот так:

<div class="container">
<div class="row">
  <div class="modal-header">
    <h1>crop Picture</h1>
  </div>

  <div class="modal-body">
    <div class="col-md-9">
    <%= image_tag @user.picture_url(:large), id: "cropbox" %>
      <div class="modal-footer">
        <%= form_for @user do |f| %>
          <div class="actions">
            <% %w[x y w h].each do |attribute| %>
              <%= f.text_field "crop_#{attribute}" %>
            <% end %>
            <%= f.submit "Crop" %>
          </div>
        <% end %>
      </div>
    </div>
  <div class="col-md-3">
    <h4>Preview</h4>
    <div style="width:120px; height:120px; overflow:hidden;">
      <%= image_tag @user.picture.url(:large), id: "image_preview" %>
    </div>
  </div>
  </div>
</div>
</div>

Проблема в том, что когда я обновляю новую картинку для пользователя, она всегда переходит на edit.html.erb, но не переходит на crop.html.erb, это для чего? Я долго искал, но не могу найти ответ. Кто-нибудь может мне помочь? Большое спасибо ..

1 Ответ

0 голосов
/ 16 мая 2018

Если элемент управления переходит на edit.html.erb после обновления, вероятно, ваше состояние if @user.update_attributes(user_params) не выполняется. Чтобы убедиться в этом, используйте update_attributes(user_params)!!), чтобы увидеть ошибку.

...