2016-04-15 15 views
1

我有行动,我在哪里将组分配给应用的成员。基本上,我只是从窗体视图中得到一个电子邮件列表,然后我有动作去捕捉它:从动作回滚模型 - 更改

我想知道的是,如果我可以回滚已经做出的更改,如果说第二个成员不存在,或者已经有一个组,我该如何回滚这些?

def group_create 
    @group = Group.new 
    params[:member].each { |m| 
    v = Volunteer.find_by_email(m[1]) 
    raise "#{m[1]} doesn't exist" unless v.present? 
    raise "#{v.email} is already in a group" if v.group.present? 
    v.group = @group 
    v.save! 
    } 
    @group.save 
rescue => error 
    flash[:error] = "Error: #{error}" 
ensure 
    respond_to do |format| 
    unless flash[:error].present? 
     flash[:notice] = 'Group Application succeded.' 
     flash[:joined] = true 
     format.html { redirect_to apply_group_path } 
    else 
     flash.discard 
     format.html { render :group } 
    end 
    end 
end 

我也想过已,是v.save和@ group.save移动到结束,并作出params[:member].each....另一个环,但是这将是ressources的相当浪费,做find_by_email-方法两次,根据需要。

回答

2

我建议将您的非控制器逻辑分为模型和ActiveRecord::Base.transaction包装它:

ActiveRecord::Base.transaction do 
    @group = Group.new 
    params[:member].each { |m| 
     v = Volunteer.find_by_email(m[1]) 
     raise "#{m[1]} doesn't exist" unless v.present? 
     raise "#{v.email} is already in a group" if v.group.present? 
     v.group = @group 
     v.save! 
    } 
    @group.save 
end 

交易作为围绕SQL语句的保护性包装,以确保对数据库的修改时,所有操作一起成功才会发生。

+0

那么,制作一个Group.assign_members,这需要一个电子邮件数组,或沿着这些线? –