Ruby on Rails - 从一个控制器更新多个模型

时间:2011-08-29 17:56:24

标签: ruby-on-rails ruby ruby-on-rails-3

我正试图从一个控制器中保存到多个模型,这可能非常简单,但我无法理解。

我的用户模型中有许多loanitemsloanitems属于设置的用户关联。

在我的loanitems控制器中,我希望每个loanitem创建操作来更新user.points

所以目前我有以下代码,不会抛出任何错误,但也不会更新用户模型。

def create
    @loanitem = current_user.loanitems.build(params[:loanitem])
    respond_to do |format|
      if @loanitem.save
        @loanitem.user.points = @loanitem.user.points + 50
        @loanitem.user.save
        format.html {redirect_to root_path, :flash => {:success => "Loan Item created" } }
        format.xml{render xml: root_path}
      else
        format.html {render 'pages/home' }
        format.xml {render xml: 'pages/home'}
      end
    end
  end

我也在尝试主题上的以下变化

  def create
    @loanitem = current_user.loanitems.build(params[:loanitem])
    respond_to do |format|
      if @loanitem.save
        current_user.points = current_user.points + 50
        current_user.save
        format.html {redirect_to root_path, :flash => {:success => "Loan Item created" } }
        format.xml{render xml: root_path}
      else
        format.html {render 'pages/home' }
        format.xml {render xml: 'pages/home'}
      end
    end
  end

但是我应该向userupdate控制器发送一些消息吗?目前看起来像这样......

def update
  @user = User.find(params[:id])
  if
    @user.update_attributes(params[:user])
    redirect_to @user, :flash => { :success => "Profile has been updated!"}
  else
    @title = "Edit Profile"
    render 'edit'
  end
end

或者我听说业务逻辑确实应该全部包含在模型中,所以也许该方法应该用User.rb编写,然后由Loanitems控制器创建方法调用?

我知道这是一个真正的菜鸟问题,但任何建议都会非常受欢迎。

1 个答案:

答案 0 :(得分:1)

听起来您需要使用Transaction,因此您可以将多个项目修改为单个原子单元:

def create
    respond_to do |format|
      User.transaction do
        begin
          @loanitem = current_user.loanitems.create!(params[:loanitem]) # raises exception if it can't create
          @loanitem.user.update_attributes!(:points => @loanitem.user.points + 50) # raises exception if it can't update

          format.html {redirect_to root_path, :flash => {:success => "Loan Item created" } }
          format.xml{render xml: root_path}

        rescue ActiveRecord::RecordInvalid
          format.html {render 'pages/home' }
          format.xml {render xml: 'pages/home'}

          raise ActiveRecord::Rollback
        end
      end
    end
  end

这允许您拥有一个简单的快乐路径,其中更新/创建多个对象,并在出现任何错误时回滚所有更改并呈现您的错误处理逻辑。对象将具有可以向用户显示的验证消息。