0

我有一个问题:我无法从 html.erb 文件中获取 :crop_x, :crop_y, :crop_w, :crop_h。

这是crop.html.erb中的代码:

<%= image_tag @product.attach.url(:large), :id => "cropbox" %>
<h4>Preview:</h4>
<div style="width:100px; height:100px; overflow:hidden">
  <%= image_tag @product.attach.url(:large), :id => "preview" %>
</div>

<%= form_for @product do |f| %>
    <%= f.number_field :crop_x, :id => 'crop_x' %>
    <%= f.number_field :crop_y, :id => 'crop_y' %>
    <%= f.number_field :crop_w, :id => 'crop_w' %>
    <%= f.number_field :crop_h, :id => 'crop_h' %>
  <p><%= f.submit "Crop" %></p>
<% end %>

控制器/products_controller.rb:

# PATCH/PUT /products/1
  # PATCH/PUT /products/1.json
  def update
    # respond_to do |format|
      if @product.update(product_params)
        # redirect_to @product
        if params[:product][:attach].blank?
          flash[:notice] = "Successfully update user."
          redirect_to @product
        else
          render :action => "crop"
        end
        # format.html { redirect_to @product, notice: 'Product was successfully updated.' }
        # format.json { head :no_content }
      else
        render action: 'edit'
      end
    # end
  end

型号/product.rb:

after_update :reprocess_avatar, :if => :cropping?

  def cropping?
    !:crop_x.blank? && !:crop_y.blank? && !:crop_w.blank? && !:crop_h.blank?
  end

def reprocess_avatar
      # product = Product.find(id)
      img = Magick::ImageList.new(self.attach.path(:original))
      args = [ :crop_x, :crop_y, :crop_w, :crop_h ]
      args = args.collect { |a| a.to_i }
      begin
        img.crop!(*args)
        img.write(self.attach.path(:original))
        self.attach.reprocess!
        self.save
      rescue => ex
        logger.error ex.message
      end
      # img.save!
    end

在模型中,错误发生在:

args = args.collect { |a| a.to_i }

它无法将符号转换为整数,但是当我删除这一行时,img 无法读取这些值进行裁剪。我确定 4 个值是一个整数。

4

2 回答 2

0

您没有正确使用符号 ( :crop_x, :crop_y, ...)。我认为您的意图是将符号用作方法名称而不仅仅是符号。

对于您的cropping,根本不需要符号,只需使用以下方法:

def cropping?
  !crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank?
end

同样,在构建时不要理会符号args,直接调用访问器方法即可:

args = [ crop_x, crop_y, crop_w, crop_h ]

而且您可能根本不需要to_i调用,因为您的cropping?方法应该nil远离。如果您出于某种原因真的想使用符号,那么您可以将符号send交给调用相应的方法:

args = [ :crop_x, :crop_y, :crop_w, :crop_h ].map { |m| send(m) }

但实际上没有必要这样做。

在表格中:

<%= f.number_field :crop_x, :id => 'crop_x' %>
<%= f.number_field :crop_y, :id => 'crop_y' %>
<%= f.number_field :crop_w, :id => 'crop_w' %>
<%= f.number_field :crop_h, :id => 'crop_h' %>

您使用符号是因为f.number_field需要一个名称,以便它可以使用适当的name属性构建 HTML,以便它可以调用方法来获取任何初始值。

于 2013-08-28T03:08:45.033 回答
0

我认为你不能使用after_update回调。

由于以下原因,该行self.attach.reprocess!会将其变成无限循环:

回形针在重新处理时保存具有图像的当前实例

是来自 Paperclip gem 的代码:

315  def reprocess!(*style_args)
316    saved_only_process, @options[:only_process] = @options[:only_process], style_args
317    begin
318      assign(self)
319      save
320      instance.save
321    rescue Errno::EACCES => e
322      warn "#{e} - skipping file."
323      false
324    ensure
325      @options[:only_process] = saved_only_process
326    end
327  end

如您所见,在上述代码的第 320 行,它正在保存实例。这意味着它会自动运行回调,这就是您将在服务器上获得无限循环的原因。

请使用此链接

于 2013-08-28T13:16:52.307 回答