论坛首页 编程语言技术论坛

在rails中优雅的进行模型校验

浏览 19496 次
该帖已经被评为精华帖
作者 正文
   发表时间:2008-09-07  
其实现在是两个好的方法中选一个更好的.

名人都说爱说的: "经验告诉我"

在满足需求的情况下.

哪种方法代码少, 就用哪种

至于性能, 到发生了再说
0 请登录后投票
   发表时间: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:才发现我们的做法可能并不冲突

0 请登录后投票
   发表时间:2008-09-07  
liuqiang 写道
注意,您还是把您这个方法的调用,说明下

class ApplicationController < ActionController::Base
  around_filter :transaction_filter
  def transaction_filter(&block)
    TransactionFilter.new.filter(self, &block)
  end
0 请登录后投票
   发表时间: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方法。
0 请登录后投票
   发表时间: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方法。

 

 我不知道您的这个方法如果遇到,某个次模型涉及到多媒体文件保存,是不是也可以级联撤销呢?

0 请登录后投票
   发表时间:2008-09-07  
不明白这和文件保存有什么关系,你可以举个具体的例子么?
我写的代码是指对你主贴中对于多个model先手工调用valid?,然后依次调用save的简化:利用AR的build添加,在save主model之前会自动调用valid?方法,包括级联对象。
0 请登录后投票
   发表时间:2008-09-07  
Quake Wang 写道
不明白这和文件保存有什么关系,你可以举个具体的例子么?
我写的代码是指对你主贴中对于多个model先手工调用valid?,然后依次调用save的简化:利用AR的build添加,在save主model之前会自动调用valid?方法,包括级联对象。

 

 哦,那基本是一个意思了,文件保存的意思是,用户头像之类的在user保存的时候,头像图片也要写进文件系统,而利用事务处理的话,如果后续model合法性出错,头像图片写进文件的操作就是白做了,显然性能上做了不必要的牺牲。

你这个方法我和文中提到的第二种方法类似,所以保存之前对于所有model先手工调用valid?是合理的!

0 请登录后投票
   发表时间: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方法。

 

 我不知道您的这个方法如果遇到,某个次模型涉及到多媒体文件保存,是不是也可以级联撤销呢?


build没有保存,只是相当于new,撤销什么?

0 请登录后投票
   发表时间: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方法。

 

 我不知道您的这个方法如果遇到,某个次模型涉及到多媒体文件保存,是不是也可以级联撤销呢?


build没有保存,只是相当于new,撤销什么?


见你LS的回复,撤销是针对图片之类的文件,叫做删除更准确点,当然,如果你可以忍受系统中许多垃圾文件的话,可以不去删除这些文件。

 

 

0 请登录后投票
   发表时间: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方法。

 

 我不知道您的这个方法如果遇到,某个次模型涉及到多媒体文件保存,是不是也可以级联撤销呢?


build没有保存,只是相当于new,撤销什么?


见你LS的回复,撤销是针对图片之类的文件,叫做删除更准确点,当然,如果你可以忍受系统中许多垃圾文件的话,可以不去删除这些文件。

 

 


你说的是上传的附件吧,在没有保存他们应该都是只存在于内存的啊

0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics