锁定老帖子 主题:在rails中优雅的进行模型校验
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-09-07
其实现在是两个好的方法中选一个更好的.
![]() 名人都说爱说的: "经验告诉我" 在满足需求的情况下. 哪种方法代码少, 就用哪种 至于性能, 到发生了再说 |
|
返回顶楼 | |
发表时间:2008-09-07
gigix 写道
liuqiang 写道
呵呵,针对20个表单的过滤器,代码肯定不止20行,2者代码都不是很多,没必要斤斤计较啦,综合考虑,您再仔细琢磨琢磨,哪种方法比较爽
8行 class TransactionFilter def filter(controller) return yield if controller.request.get? ActiveRecord::Base.transaction do yield end end end 你大概还需要2~3行把它声明在application.rb里面 作为比较,我这个项目大概有150~200个action 重点在于: (1)重复 (2)不必要的思考
好吧,比吧,unless [@user, @city, @order].map(&:valid?).include?(false) 这是个条件表达式,不算一行代码,所以我这个是0行代码 注意,您还是把您这个方法的调用,也说明下
PS:才发现我们的做法可能并不冲突 |
|
返回顶楼 | |
发表时间:2008-09-07
liuqiang 写道 注意,您还是把您这个方法的调用,说明下
class ApplicationController < ActionController::Base around_filter :transaction_filter def transaction_filter(&block) TransactionFilter.new.filter(self, &block) end |
|
返回顶楼 | |
发表时间:2008-09-07
根据我的经验,如果一个复杂的表单提交牵涉到多个model,这多个model之间往往都是有关联的,而且会有一个主要模型。利用ActiveRecord提供的级联操作,你的例子可以这样简化:
def create @city = City.new params[:city] @user = @city.users.build params[:user] @order = @user.orders.build params[:order] @city.save ? redirect_to "/main/new" : render :action => "new" end 示意代码,仅供参考,具体可以查看association_collection.rb的build方法。 |
|
返回顶楼 | |
发表时间:2008-09-07
Quake Wang 写道
根据我的经验,如果一个复杂的表单提交牵涉到多个model,这多个model之间往往都是有关联的,而且会有一个主要模型。利用ActiveRecord提供的级联操作,你的例子可以这样简化:
def create @city = City.new params[:city] @user = @city.users.build params[:user] @order = @user.orders.build params[:order] @city.save ? redirect_to "/main/new" : render :action => "new" end 示意代码,仅供参考,具体可以查看association_collection.rb的build方法。
我不知道您的这个方法如果遇到,某个次模型涉及到多媒体文件保存,是不是也可以级联撤销呢? |
|
返回顶楼 | |
发表时间:2008-09-07
不明白这和文件保存有什么关系,你可以举个具体的例子么?
我写的代码是指对你主贴中对于多个model先手工调用valid?,然后依次调用save的简化:利用AR的build添加,在save主model之前会自动调用valid?方法,包括级联对象。 |
|
返回顶楼 | |
发表时间:2008-09-07
Quake Wang 写道
不明白这和文件保存有什么关系,你可以举个具体的例子么?
我写的代码是指对你主贴中对于多个model先手工调用valid?,然后依次调用save的简化:利用AR的build添加,在save主model之前会自动调用valid?方法,包括级联对象。
哦,那基本是一个意思了,文件保存的意思是,用户头像之类的在user保存的时候,头像图片也要写进文件系统,而利用事务处理的话,如果后续model合法性出错,头像图片写进文件的操作就是白做了,显然性能上做了不必要的牺牲。 你这个方法我和文中提到的第二种方法类似,所以保存之前对于所有model先手工调用valid?是合理的! |
|
返回顶楼 | |
发表时间:2008-09-08
liuqiang 写道
Quake Wang 写道
根据我的经验,如果一个复杂的表单提交牵涉到多个model,这多个model之间往往都是有关联的,而且会有一个主要模型。利用ActiveRecord提供的级联操作,你的例子可以这样简化:
def create @city = City.new params[:city] @user = @city.users.build params[:user] @order = @user.orders.build params[:order] @city.save ? redirect_to "/main/new" : render :action => "new" end 示意代码,仅供参考,具体可以查看association_collection.rb的build方法。
我不知道您的这个方法如果遇到,某个次模型涉及到多媒体文件保存,是不是也可以级联撤销呢?
|
|
返回顶楼 | |
发表时间:2008-09-08
wosmvp 写道
liuqiang 写道
Quake Wang 写道
根据我的经验,如果一个复杂的表单提交牵涉到多个model,这多个model之间往往都是有关联的,而且会有一个主要模型。利用ActiveRecord提供的级联操作,你的例子可以这样简化:
def create @city = City.new params[:city] @user = @city.users.build params[:user] @order = @user.orders.build params[:order] @city.save ? redirect_to "/main/new" : render :action => "new" end 示意代码,仅供参考,具体可以查看association_collection.rb的build方法。
我不知道您的这个方法如果遇到,某个次模型涉及到多媒体文件保存,是不是也可以级联撤销呢?
|
|
返回顶楼 | |
发表时间:2008-09-08
liuqiang 写道
wosmvp 写道
liuqiang 写道
Quake Wang 写道
根据我的经验,如果一个复杂的表单提交牵涉到多个model,这多个model之间往往都是有关联的,而且会有一个主要模型。利用ActiveRecord提供的级联操作,你的例子可以这样简化:
def create @city = City.new params[:city] @user = @city.users.build params[:user] @order = @user.orders.build params[:order] @city.save ? redirect_to "/main/new" : render :action => "new" end 示意代码,仅供参考,具体可以查看association_collection.rb的build方法。
我不知道您的这个方法如果遇到,某个次模型涉及到多媒体文件保存,是不是也可以级联撤销呢?
|
|
返回顶楼 | |