Ruby on rails RubyonRails-从一个控制器更新多个模型
我正试着让我的头脑从一个控制器保存到多个模型,这可能真的很简单,但我无法理解 我有一个用户模型,它有许多Ruby on rails RubyonRails-从一个控制器更新多个模型,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我正试着让我的头脑从一个控制器保存到多个模型,这可能真的很简单,但我无法理解 我有一个用户模型,它有许多借项,而借项属于建立的用户关联 在我的loanitems控制器中,我希望每个loanitem创建操作来更新用户点 因此,目前我有以下代码,它不会抛出任何错误,但也不会更新用户模型 def create @loanitem = current_user.loanitems.build(params[:loanitem]) respond_to do |format|
借项
,而借项
属于建立的用户关联
在我的loanitems
控制器中,我希望每个loanitem
创建操作来更新用户点
因此,目前我有以下代码,它不会抛出任何错误,但也不会更新用户模型
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
controllers create方法调用
我知道这是一个真正的新手问题,但任何建议都是非常受欢迎的 听起来您需要使用一个事务,因此您可以将多个项目作为单个原子单元进行修改:
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
这允许您有一个简单的快乐路径,其中更新/创建多个对象,并在出现任何错误时回滚到目前为止的所有更改,并呈现错误处理逻辑。对象将具有您可以向用户显示的验证消息。我以前从未遇到过此事务-尽管它看起来不错-将让它旋转一下,然后返回给您。为帮助干杯!嘿,温菲尔德-尝试了一下-但是@loanitem.user.update\u属性失败了!(:points=>@loanitem.user.points+50)行。我试着在用户模型中使用points attr_accessor,但这会在您没有预料到的情况下抛出一个nil对象!您可能期望数组的一个实例。在评估nil时出错。+(我只是在猜测)Winfield我让它工作了-感谢您的帮助-我做了一个小小的更改,因为我在用户模型上验证了电子邮件和密码-我需要使用update_attributes方法将这些值传递给-再次感谢您的帮助。