在方法的末尾添加一个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
答案 0 :(得分:0)
条形foo
或user
中的某个关联中存在验证错误或更多错误。尝试检查这些对象:
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
的终端。创建无法保存的唯一原因是由于验证错误本身或嵌套关联。