小编MDe*_*ker的帖子

在Ruby On Rails控制器方法中使用事务

我喜欢Ruby On Rails,每天我都在学习和提高自己的技能.目前我正在开发一个由多个客户端使用的应用程序,我想重构我的代码,这样我就可以对代码的质量充满信心.

我正在努力实现异常处理和使用事务.我有一个控制器,必须创建和更新三个对象.以简化我的情况.

在我的控制器中:

def update
  @user.change_value_x  #(1) effects Model 'User'
  if condition == y 
    @user.create_coupon #(2) effects Model 'Coupon' via Model 'User' 
  end
  create_a_history_item #(3) effect Model 'History' 
end
Run Code Online (Sandbox Code Playgroud)

第一个(1)和第二个方法(2)位于用户模型中,第三个方法(3)也由其他控制器使用,位于/ lib目录中的Module中.所有方法都在更新/保存/创建数据库项.

如果其中一个操作失败,则所有数据库操作都应回滚并提供有关该问题的反馈.

我知道'交易'是一个很好的解决方案,我也有红色,在不同的帖子中,交易不应该在控制器中使用.
问题:这是为什么?

所以我猜这段代码不是实现事务的正确方法.

def update
  ActiveRecord::Base.transaction do
    @user.change_value_x  #(1) effects Model 'User'
    if condition == y 
      @user.create_coupon #(2) effects Model 'Coupon' via Model 'User' 
    end
    create_a_history_item #(3) effect Model 'History'
  end
  rescue
  #some code that gives feedback to user about the problem
end
Run Code Online (Sandbox Code Playgroud)

处理这个问题的最佳/正确方法是什么?

ruby controller transactions ruby-on-rails rescue

5
推荐指数
2
解决办法
6851
查看次数

使用“ImageKit”对 django 中的关闭文件进行 I/O 操作

在我的 django 项目中,我使用 ImageKit 来调整我的个人资料图像的大小。

我有一个包含这些字段的模型:

pasfoto = models.ImageField(upload_to='images/', blank=True)
pasfoto_thumbnail = ImageSpecField(source='pasfoto',
                                      processors=[ResizeToFill(150, 200)],
                                      format='JPEG',
                                      options={'quality': 60})
Run Code Online (Sandbox Code Playgroud)

ImageSpecField 是从 Imagekit 导入的。

我通过 Django-storages 将图像保存在 amazon-S3 上

当我通过 UpdateView 呈现的模板(编辑表单)上传图像时,它会在成功后显示详细模板。此模板中使用了 pasfoto_thumbnail,它是通过 Django 中基于类的 DetailView 呈现的。

在这种情况下,我看到错误“对已关闭文件进行 I/O 操作”。但浏览器刷新后显示正确的图像。发生了什么事以及如何解决这个问题?


此错误的 Django 调试页面/信息

django io django-imagekit

3
推荐指数
1
解决办法
1294
查看次数