如何显示两个对象的错误,除非两者都有效,否则不保存

时间:2011-09-13 09:34:26

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

我有两个对象用户板的表单

这是我的控制器:

def create
     @board = Board.new(params[:board])
     @user  = User.new(params[:user])
      respond_to do |format|
        if (@user.save and @board.save)
          format.js {redirect_to some_path}
        else
          format.js {render :action => "new" }
        end
      end
  end

除非两者都有效,否则我不想保存任何一个。我想在表单上同时显示两者的错误消息。

我尝试了'&&'的所有类型的组合'&安培;' '和'但他们没有给我我想要的结果。它们在保存另一个对象时显示一个对象的错误。

我该如何正确地做到这一点?

2 个答案:

答案 0 :(得分:3)

&&与Linux中的&&不同。

你有两种选择。您可以检查记录是否为valid?,然后执行保存。

def create
  @board = Board.new(params[:board])
  @user  = User.new(params[:user])
  respond_to do |format|
    if @user.valid? && @board.valid?
      @user.save!
      @board.save!
      format.js { redirect_to some_path }
    else
      # do something with #errors.
      # You check the existence of errors with
      #   @user.errors.any?
      #   @board.errors.any?
      # and you access the errors with
      #   @user.errors
      #   @board.errors
      format.js { render :action => "new" }
    end
  end
end

或者如果您的数据库支持事务,请使用事务。

def create
  @board = Board.new(params[:board])
  @user  = User.new(params[:user])
  respond_to do |format|
    begin
      transaction { @user.save! && @board.save! }
      format.js { redirect_to some_path }
    rescue ActiveRecord::RecordInvalid
      format.js { redirect_to some_path }
    end
  end
end

就个人而言,我会检查valid?

答案 1 :(得分:0)

如果你查看ActiveRecord的save方法的源代码,你会看到:

def save(options={})
  perform_validations(options) ? super : false
end

您要做的是,在调用save之前手动运行perform_validations。为此,你可以使用有效的?来自ActiveResource的方法。您可以在这里找到文档:

http://api.rubyonrails.org/classes/ActiveRecord/Validations.html#method-i-valid-3F