为什么添加爆炸使创造工作?

时间:2014-07-22 00:42:34

标签: ruby-on-rails activerecord

在方法的末尾添加一个bang的Rails约定使它在失败时抛出异常。但我的经验并不符合这种行为。

我的控制器用于多对多关系(审计跟踪)。无法创建关系对象,只能通过将事件发布到审计跟踪对象来更新。 (这意味着您通过更新来创建...)

我有一个User对象和一个Foo对象,我将调用关系Bar。

    bar=Bar.where(:user_id=>params[:user_id]).where(:foo_id=>params[:foo_id]).first
    if bar
        authorize! :update, bar
    else
        user=User.find(params[:user_id])
        authorize! :bar_create, user
        foo=Foo.find(params[:foo_id])
        bar=Bar.create!(:user_id=>user.id, :foo_id=>foo.id)
    end

create方法不起作用。我调试了,bar.save工作正常,但create的全部要点是避免必须进行第二次保存调用。我进行了实验,发现create!工作正常。

编辑:

随着我继续,我发现create! ,实际上,总是保存。基础对象中没有错误,只是神秘地没有保存。

我必须拨打create电话,然后拨打save电话,说实话,我真的不明白。

编辑:每个请求,添加模型代码 - 通过删除不必要的方法,验证调用等简化到相关语句。 (在写这篇文章的时候,我注意到我还没有添加has_many:通过电话,但是......看起来似乎不应该与手头的问题相关。

class User < ActiveRecord::Base

    has_secure_password


    has_many :progresses

end

class Bar < ActiveRecord::Base
  belongs_to :user
  belongs_to :foo

  has_many :bar_events

  validates :user, :presence=>true
  validates :foo, :presence=>true


  scope :user_id, -> (user_id){ where user_id: user_id}
  scope :foo_id, -> (foo_id){ where foo_id: foo_id}
end

class Foo < ActiveRecord::Base
end

1 个答案:

答案 0 :(得分:0)

条形foouser中的某个关联中存在验证错误或更多错误。尝试检查这些对象:

bar=Bar.create!(:user_id=>user.id, :foo_id=>foo.id)
puts bar.errors.inspect, bar.user.errors.inspect, bar.foo.errors.inspect

这会将所有这些对象的错误打印到运行rails server的终端。创建无法保存的唯一原因是由于验证错误本身或嵌套关联。