def create
@subjection = @subject.subjections.new
if params[:video_or_show_id].length == 20
show = Show.where(:showid => params[:video_or_show_id]).try(:first)
if show.present?
@show = show
else
begin
@show = Show.build_from_show_id(params[:video_or_show_id])
@subjection.subjectable_type = "show"
@subjection.subjectable_id = @show.id
@subjection.title = @show.showname
@subjection.sub_title = @show.showsubtitle
@subjection.description = @show.showdesc
@subjection.save
if @show.save
img_v = @subjection.pictures.new(:url => @show.show_vthumburl,
:name => "img_v")
img_v.save
img_h = @subjection.pictures.new(:url => @show.show_thumburl,
:name => "img_h")
img_h.save
end
rescue ArgumentError, Youku::DS::Error => e
@show = Show.new
@show.errors.add(:base, e.message)
redirect_to new_subject_subjection_path(@subject), :notice => "视频没有版权"
end
end
else
video = Video.where(:videoid => params[:video_or_show_id]).try(:first)
if video.present?
@video = video
else
begin
@video = Video.build_from_video_id(params[:video_or_show_id])
if @video.videoid.present?
@subjection.subjectable_type = "video"
@subjection.subjectable_id = @video.id
@subjection.description = @video.desc
@subjection.title = @video.title
@subjection.save
if @video.save
img_h = @subjection.pictures.new(:url => @video.thumburl,
:name => "img_h")
img_h.save
end
end
rescue ArgumentError, Youku::DS::Error => e
@video = Video.new
@subjection.errors.add(:base, e.message)
render :error and return
end
end
end if @subjection.save
redirect_to subject_subjections_url(@subject), notice: '新建成功'
else
render :new
end
end

修改后

if persisted? # 如果是已经保存到数据库的 ActiveRecord 对象
super # 则调用原始的 subjectable= 方法
只有在新建一个 subjection 时,调用 subjectable= 方法的时做一些特殊处理,
比如给 title, sub_title 和 description 赋值
def create
@subjection = @subject.subjections.build
id = params[:video_or_show_id] subjectable = if id.length == 20
find_or_create_show_from_show_id(id)
else
find_or_create_video_from_video_id(id)
end @subjection.subjectable = subjectable if @subjection.save
redirect_to subject_subjections_url(@subject), notice: '新建成功'
else
render :error
end
rescue ArgumentError, Youku::DS::Error => e
@subjection.errors.add(:base, e.message)
render :error
end private
def find_or_create_show_from_show_id(id)
if show = Show.find_by_showid(id)
show
else
show = Show.build_from_show_id(id)
show.save
show
end
end def find_or_create_video_from_video_id(id)
if video = Video.find_by_videoid(id)
video
else
video = Video.build_from_video_id(id)
video.save
video
end
end
def subjectable=(subjectable)
if persisted?
super
else
self.attributes = {
subjectable_type: subjectable.class.name,
subjectable_id: subjectable.id
} case subjectable
when Show
self.attributes = {
title: subjectable.showname,
sub_title: subjectable.showsubtitle,
description: subjectable.showdesc,
pictures_attributes: [{ name: 'img_h', url: subjectable.show_thumburl },
{ name: 'img_v', url: subjectable.show_vthumburl }]
}
when Video
self.attributes = {
title: subjectable.title,
description: subjectable.desc,
pictures_attributes: [{ name: 'img_h', url: subjectable.thumburl }]
}
else
super
end
end
end

sujection重构的更多相关文章

  1. 记一次.NET代码重构

    好久没写代码了,终于好不容易接到了开发任务,一看时间还挺充足的,我就慢慢整吧,若是遇上赶进度,基本上直接是功能优先,完全不考虑设计.你可以认为我完全没有追求,当身后有鞭子使劲赶的时候,神马设计都是浮云 ...

  2. CSharpGL(17)重构CSharpGL

    CSharpGL(17)重构CSharpGL CSharpGL用起来我自己都觉得繁琐了,这是到了重构的时候. 下载 CSharpGL已在GitHub开源,欢迎对OpenGL有兴趣的同学加入(https ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(58)-DAL层重构

    系列目录 前言:这是对本文系统一次重要的革新,很久就想要重构数据访问层了,数据访问层重复代码太多.主要集中增删该查每个模块都有,所以本次是为封装相同接口方法 如果你想了解怎么重构普通的接口DAL层请查 ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(59)-BLL层重构

    系列目录 前言:  这应该是本系统最后一次重构,将重构BLL层和Model层.来完全取代代码生成器生成的BLL层和DAL层.完全废掉了代码生成器的DAL,BLL,MODEL层.  全自动生成增,删,改 ...

  5. 原生JS实现全屏切换以及导航栏滑动隐藏及显示——重构前

    思路分析: 向后滚动鼠标滚轮,页面向下全屏切换:向前滚动滚轮,页面向上全屏切换.切换过程为动画效果. 第一屏时,导航栏固定在页面顶部,切换到第二屏时,导航条向左滑动隐藏.切换回第一屏时,导航栏向右滑动 ...

  6. Android重构与设计之路,从整理提示弹窗(SmartAlertPop)开始

    封装一个独立弹窗Module,这里的弹窗包括普通的Dialog方式弹框和WindowManager方式弹窗.提供一种管理项目里面弹窗的方案,便于后期修改和维护. 首先描述一个在大项目中普遍存在的一个现 ...

  7. 产品前端重构(TypeScript、MVC框架设计)

    最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容. 公司期望把某一管理类信息系统从项目代码中抽取.重构为一个可复用的产品.该系统的前端是基于 ExtJs 5 进行构造的, ...

  8. 一枚招聘信息——分期乐招页面重构/UI开发(8k-12k 深圳 经验1-3年 学历不限 全职)

    腾讯人创建的分期乐公司,急需页面重构人才若干枚,公司前景好,机会难得,有兴趣的速速 8k-12k 深圳 经验1-3年 学历不限 全职 公司网站: http://www.fenqile.com/ 职位诱 ...

  9. [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

随机推荐

  1. Ajax与json

    Ajax Ajax简介 Ajax技术,从用户发送请求到获取响应,当用户界面在整个过程中不会受到干扰,而且我们可以在必要的时候只刷新页面的一小部分,而不用刷新整个页面,即"无刷新"技 ...

  2. CSS之cursor属性

    CSS之cursor属性 今天学习了CSS的cursor属性,第一篇博客就用来总结它吧. cursor属性用于控制光标的显示样式,可取的值有这些: cursor:url()*|{auto|defaul ...

  3. [[其他教程]] 2015年最新版iOS基础视频_最适合初学者入门

    主讲:孙庆虎类型:iOS 适合对象:初学者入门视频介绍:本视频是iOS学院精心录制的免费精华版iOS语言基础视频,该视频特点在于最大程度保证了知识点的完整性,按知识点进行视频录制,每个视频控制在20分 ...

  4. Android 自定义Dialog类,并在Activity中实现按钮监听。

      实际开发中,经常会用到Dialog,比如退出时候会弹出是否退出,或者还有一些编辑框也会用Dialog实现,效果图如下: 开发中遇到的问题无非在于如果在Activity中监听这个Dialog中实现的 ...

  5. MacTalk阅读有感

    MacTalk by 池建强 高手的思维境界 -贴地气 -有思想 技术普及 文字是表达人思想的载体,池老师将自己的经历,经验分享给大家,很值得大家学习,虽然我只是个初出茅庐的小菜,现在有指路明灯一样. ...

  6. SVN集中式版本控制器的安装、使用与常见问题汇总

    SVN是Subversion的简称,是一个开放源代码的版本控制系统,它采用了分支管理系统,集中式版本控制器 官方网站:https://www.visualsvn.com/ 下载右边的服务器端,左边的客 ...

  7. PHP处理0e开头md5哈希字符串缺陷/bug

    PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他 ...

  8. Codeforces 2016 ACM Amman Collegiate Programming Contest A. Coins(动态规划/01背包变形)

    传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Ha ...

  9. JS控制flash的方法

    JS控制flash的一些方法:Play() ---------------------------------------- 播放动画 StopPlay()---------------------- ...

  10. 面试web前端开发,被打击了

    今天我去面试web前端开发,被打击了,也跟我也有一定的关系,最基础的东西我都没回答好,哎! 主要是我在等我有意向的公司给我发offer,闲着没事,刚好又有公司叫我去面试,我抱着多面一家也没有啥子坏处就 ...