Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails-从一个控制器更新多个模型_Ruby On Rails_Ruby_Ruby On Rails 3 - Fatal编程技术网

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方法将这些值传递给-再次感谢您的帮助。