Рельсы несущей волны + jcrop + бутстрап

Я использую Rails 4 с драгоценными камнями mini_magick, несущей волны, jcrop-rails-v2 и bootstrap-sass. У меня есть загрузка изображения, которая обрезает изображение после его сохранения, но мне нужно обрезать его перед сохранением в модальном режиме начальной загрузки. Нашел этот учебник: http://mark.stratmann.me/content_items/image-cropping-with-rails-3-2-carrierwave-bootstrap-modals-jcrop, но я новичок в Rails, и это кажется сложным, и я не знаю как объединить это с моим кодом. Еще одна вещь, которую мне нужно сделать, но я не знаю, как сохранить исходный файл после обрезки.

Мои файлы:

users_controller.rb:

class UsersController < ApplicationController
  def index
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      if params[:user][:avatar].present?
        render :crop
      else
        redirect_to @user, notice: "Successfully created user."
      end
    else
      render :new
    end
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(user_params)
      if params[:user][:avatar].present?
        render :crop
      else
        redirect_to @user, notice: "Successfully updated user."
      end
    else
      render :new
    end
  end

  def destroy
    @user = User.find(params[:id])
    @user.destroy
    redirect_to users_url, notice: "Successfully destroyed user."
  end

  private

  def user_params
    params.require(:user).permit(:name, :avatar, :crop_x, :crop_y, :crop_w, :crop_h)
  end

end

пользователь.rb

class User < ActiveRecord::Base
  mount_uploader :avatar, AvatarUploader
  after_update :crop_avatar

  attr_accessor :crop_x, :crop_y, :crop_w, :crop_h

  def crop_avatar
    if crop_x.present?
      mini_magick = MiniMagick::Image.open(self.avatar.large.path)
      crop_params = "#{crop_w}x#{crop_h}+#{crop_x}+#{crop_y}"
      mini_magick.crop(crop_params)
      mini_magick.write(self.avatar.path)
      avatar.recreate_versions!
    end
  end

end

avatar_uploader.rb:

class AvatarUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  storage :file

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

  version :large do
    resize_to_limit(600, 600)
  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
        img.crop "#{model.crop_x}x#{model.crop_y}+#{model.crop_w}+#{model.crop_h}"
        img
      end
    end
  end
end

пользователи.js.coffee:

jQuery ->
  new AvatarCropper()

class AvatarCropper
  constructor: ->
    $('#cropbox').Jcrop
      aspectRatio: 1
      setSelect: [0, 0, 600, 600]
      onSelect: @update
      onChange: @update

 update: (coords) =>
   $('#user_crop_x').val(coords.x)
   $('#user_crop_y').val(coords.y)
   $('#user_crop_w').val(coords.w)
   $('#user_crop_h').val(coords.h)
   @updatePreview(coords)

  updatePreview: (coords) =>
      $('#preview').css
              width: Math.round(100/coords.w * $('#cropbox').width()) + 'px'
              height: Math.round(100/coords.h * $('#cropbox').height()) + 'px'
              marginLeft: '-' + Math.round(100/coords.w * coords.x) + 'px'
              marginTop: '-' + Math.round(100/coords.h * coords.y) + 'px'

Я взял за основу отливку рельсов №182. Спасибо.


person William Weckl    schedule 09.01.2014    source источник
comment
Просто мысль: похоже, что метод MiniMagick write записывает по тому же пути, по которому находится необрезанное изображение, что перезапишет исходное изображение. В противном случае ваш код довольно хорош   -  person spb1994    schedule 27.12.2015
comment
Вы когда-нибудь выясняли, как обрезать перед сохранением?   -  person user4584963    schedule 16.07.2016
comment
@user4584963 user4584963 Я использую драгоценный камень скрепки, и у меня больше нет таких проблем. :)   -  person William Weckl    schedule 17.07.2016
comment
@WilliamWeckl Что заставило тебя переключиться? Вы сейчас используете скрепку с jcrop? Я на самом деле переключился на несущую волну с скрепки некоторое время назад, и это было больно.   -  person user4584963    schedule 18.07.2016
comment
@user4584963 user4584963 в настоящее время я больше не использую рельсы для отображения своих представлений. Но эта обрезка и изменение размера из скрепки проще. Я изменился, потому что с несущей волной все кажется более болезненным, в более новом проекте я протестировал скрепку и получил удовольствие.   -  person William Weckl    schedule 19.07.2016