gpt4 book ai didi

ruby-on-rails - RailsCast 182(修订版): Jcrop not working

转载 作者:行者123 更新时间:2023-12-05 01:28:22 26 4
gpt4 key购买 nike

我正在尝试以与 Ryan Bates 在 RailsCasts 第 182 集(修订版)中使用它的方式完全相同的方式将 Carrierwave 与 Jcrop 一起使用,但我无法让 Jcrop 工作,我不知道为什么。

当我到达 crop.html.erb ,它按预期显示原始图片和预览,但我无法在原始图片上选择任何内容并且预览没有响应。

我玩了一点,当我添加 ()后面 .Jcrop我至少可以在原始图片上选择一些东西,但预览仍然没有响应,所选区域也没有保持纵横比为 1。所以我猜出于某种原因 .Jcrop 之后的代码不被执行。我不是 CoffeeScript 专家,所以我需要一些帮助来解决这个问题。

这是我的代码。非常感谢!
user.js.coffee :

jQuery ->
new AvatarCropper()

class AvatarCropper
constructor: ->
$('#cropbox').Jcrop() ->
aspectRatio: 1
setSelect: [0, 0, 500, 500]
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'
users_controller.rb :
  def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
if params[:user][:avatar].present?
render :crop
else
redirect_to @user, notice: "Successfully updated user."
end
else
render :new
end
end

def crop
@user = User.find(params[:id])
render view: "crop"
end
users/crop.html.erb :
<h1>Crop Avatar</h1>
<%= image_tag @user.avatar_url(:pre_crop), id: "cropbox" %>

<h4>Preview</h4>
<div style="width:100px; height:100px; overflow:hidden;">
<%= image_tag @user.avatar.url(:pre_crop), :id => "preview" %>
</div>

<%= form_for @user do |f| %>
<div class="actions">
<% %w[x y w h].each do |attribute| %>
<%= f.hidden_field "crop_#{attribute}"%>
<% end %>
<%= f.submit "Crop" %>
</div>
<% end %>

最佳答案

这不是你想要的:

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

它使用函数( -> )作为参数调用 Jcrop 插件,而 Jcrop 不知道如何处理函数。添加括号:
$('#cropbox').Jcrop() ->
aspectRatio: 1
setSelect: [0, 0, 500, 500]
onSelect: @update
onChange: @update

没有多大帮助;正确调用插件( .Jcrop() ),然后尝试将其返回值调用为另一个将函数作为参数的函数:
$('#cropbox').Jcrop()(-> ...)

这让您可以使用裁剪器,但除非 Jcrop 插件返回一个函数,否则您可能会收到错误;无论如何,这不会让您的选项进入 Jcrop 插件,因此您的回调不会被调用,Jcrop 也不会看到纵横比。

我想你只是想放弃 -> (并且不包括括号)以便您使用选项对象调用 Jcrop 插件:
$('#cropbox').Jcrop
aspectRatio: 1
setSelect: [0, 0, 500, 500]
onSelect: @update
onChange: @update

或者,如果括号帮助您查看分组,您可以这样做:
$('#cropbox').Jcrop(
aspectRatio: 1
setSelect: [0, 0, 500, 500]
onSelect: @update
onChange: @update
)

完成后,您需要仔细查看您的缩进,您的 AvatarCropper 没有 updateupdatePreview方法,因为它们缩进得太远了:
class AvatarCropper
constructor: ->
$('#cropbox').Jcrop
...
update: (coords) =>
...
updatePreview: (coords) =>

这最终定义了一个匿名对象,如 {update: ..., updatePreview: ...}然后它被扔掉;如果缩进更深(比如 4 个空格)或不同的编辑器,这个问题会更明显,但我不会详细说明这一点,只要说你必须在 CoffeeScript 中非常仔细地观察你的空格就足够了;也许更好的编译器警告将有助于解决这个太常见的错误。修复你的缩进,你一切都很好:

演示: http://jsfiddle.net/ambiguous/jTvV3/

关于ruby-on-rails - RailsCast 182(修订版): Jcrop not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10438012/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com