我正试图从一个控制器中保存到多个模型,这可能非常简单,但我无法理解。
我的用户模型中有许多loanitems
且loanitems
属于设置的用户关联。
在我的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
控制器创建方法调用?
我知道这是一个真正的菜鸟问题,但任何建议都会非常受欢迎。
答案 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
这允许您拥有一个简单的快乐路径,其中更新/创建多个对象,并在出现任何错误时回滚所有更改并呈现您的错误处理逻辑。对象将具有可以向用户显示的验证消息。