rails小重构:将图片加入产品Model之二

简介:

在前面我们重构了product中图片的实现,但是还是有一些小问题.比如用户如果上传一个非图片格式的文件时的验证情况.
我们之前是将图片格式验证代码放在Picture类中:

validates_format_of :content_type,with:/\Aimage/,
    message:"you can only upload picture format"

但是我实际操作的是Product类的对象,我怎么在图片格式错误时由picture通知product呢?
一种方法是在product的after_save中手动写代码判断picture的格式是否正确,类似如下:

def after_save
  if pic_tmp
    if pic_tmp.format_error
      #do something!!!
    end
  end
end

但实际上,图片格式的验证应该放在图片中,而不能在其之外验证,因为图片最知道其的正确格式,product不可以代俎越庖.所以增加一个before_save方法,调用picture格式的验证;该验证不能放在after_save中,因为这时product已经保存过了:

def before_save
        if pic_tmp
            pic = Picture.new
            pic.uploaded_picture(pic_tmp)
            if pic.invalid?
                errors.add(:pic_tmp,pic.errors.messages.values.join(""))
                return false
            end
        end
    end

代码中如果picture验证出错,则将其错误信息放入product的pic_tmp对象的errors中,这样在提交后就可以看到错误提示了.
最后别忘了要在after_save中添加pic_tmp.rewind语句,因为before_save中调用了pic_tmp.read,这时必须重新定位到数据开头,否则什么也读不到了.

相关文章
|
6月前
|
JavaScript 前端开发 C++
和chatgpt学架构03-引入UI框架(elment-plus)
和chatgpt学架构03-引入UI框架(elment-plus)
|
10月前
|
监控 安全 测试技术
用 Python 撸一个 Web 服务器-第7章:重构——更好的组织代码
用 Python 撸一个 Web 服务器-第7章:重构——更好的组织代码
|
计算机视觉
ElementUI:component组件库CV工程师友好资料整理
ElementUI:component组件库CV工程师友好资料整理
62 0
|
前端开发
前端知识学习案例7vs code-安装扩展
前端知识学习案例7vs code-安装扩展
42 0
前端知识学习案例7vs code-安装扩展
|
前端开发 JavaScript
前端框架:第二章:Layui(类UI ) 框架:关于2.2.5版本没有rate模块的解决方案
前端框架:第二章:Layui(类UI ) 框架:关于2.2.5版本没有rate模块的解决方案
177 0
前端框架:第二章:Layui(类UI ) 框架:关于2.2.5版本没有rate模块的解决方案
|
运维 安全 JavaScript
DEMO 模型 -- 成为更好的开发者
DEMO 模型 -- 成为更好的开发者
142 0
|
算法 NoSQL Java
工程化的项目中使用什么作为唯一ID(附代码) | 架构篇
工程化的项目中使用什么作为唯一ID(附代码) | 架构篇工程化的项目中使用什么作为唯一ID(附代码) | 架构篇
工程化的项目中使用什么作为唯一ID(附代码) | 架构篇
|
前端开发 C# 开发者
WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code)
原文:WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code)      我们第一步就是去了解三层架构和问题然后去看MVVM是怎么去解决这些问题的。      现在,感觉和事实是完全不同的两个东西。
1422 0