更新ActiveRecord对象,包括关联和获取错误消息

时间:2013-12-16 01:29:15

标签: ruby-on-rails activerecord

我正在尝试更新包含has_many关联的记录,并希望处理任何错误。如果没有关联但是如果关联无效(例如违反了唯一约束),那么使用update_attributes可以很好地工作,那么我得到的只是ActiveRecord::RecordNotSaved错误,但@object.errors中没有任何内容}。

控制器代码

respond_to do |format|
  begin
    if @calmapp_version.update_attributes(params[:calmapp_version])
      tflash('update', :success, {:model=>@@model, :count=>1})
      format.html { redirect_to( :action => "index")} 
      format.xml  { head :ok }
    else
      format.html { render :action => "edit" }
    end
  rescue ActiveRecord::RecordNotSaved => e
     flash[:error] = @calmapp_version.errors.full_messages
     format.html { render :action => "edit" }
  end
end

模型

    class CalmappVersion < ActiveRecord::Base
      has_many :calmapp_versions_translation_languages, :dependent => :destroy
      ....
    end

    class CalmappVersionsTranslationLanguage < ActiveRecord::Base
      belongs_to :calmapp_version
      belongs_to :translation_language

      validates :translation_language_id, :uniqueness => {:scope=> :calmapp_version_id}
    end

违反唯一性消息的位置在哪里?如何访问它?

2 个答案:

答案 0 :(得分:0)

我会尝试使用update_attributes!。注意!如果记录无效,这将产生异常,并让您更深入地了解出现了什么问题。

答案 1 :(得分:0)

关于另一个问题Where is the violation of uniqueness message and how do I access it?

您可以在此处查看(http://guides.rubyonrails.org/active_record_validations.html#uniqueness)并将消息包含在唯一性哈希中,例如

validates :translation_language_id, :uniqueness => {:scope=> :calmapp_version_id, message => 'There Can Be Only 1'}