我有以下用于在用户控制器中为用户创建图片的代码:
def new
@user = User.new
@pictures = @user.pictures.build({:placement => "front"},{:placement => "profile"})
end
但是,当我创建新用户时,它不会自动构建展示位置为“front”或“profile”的图片。事实上,图片没有任何更新。图片模型有
attr_accessible :placement
和picture.rb
belongs_to :user
并在user.rb
中has_many :pictures
accepts_nested_attributes_for :pictures, allow_destroy: true
为什么我的构建命令无声地失败?
使用.save!,我已经知道正在分配@pictures
,但问题是没有user_id与它们相关联。当我故意分配user_id时,如:
def new
@user = User.new
@pictures = @user.pictures.build({:placement => "front", :user_id => @user.id},{:placement => "profile", :user_id => @user.id})
end
它仍然没有分配user_id。
奇怪的是,当我在rails控制台中运行相同的命令时,会正确分配 user_id。
在@pictures命令运行之后,新的@user似乎没有为他分配自动ID,但是控制台版本正在成功,因为它正在按顺序执行操作。
所以,这就是为什么我看到一个空白的id。
为什么会这样?并不是这个同时的ID赋值模型应该用belongs_to
和has_many
以及accepts_nested_attributes_for
来处理?
如果在保存之后才创建将它们链接在一起的ID,那么解决分配嵌套属性的适当方法是什么?
为什么这不起作用?
答案 0 :(得分:1)
不确定这是否是您的问题,但您需要将:user_id添加到picture.rb中的attr_acessible行。您想要读/写的任何属性都需要是attr_accessible,否则您将获得该质量分配错误。
答案 1 :(得分:0)
它位于文档中:用户ID在保存后由数据库分配。因此,您必须先保存用户,然后才能使用user_id。
如果您更改:user_id => @ user.id to:user => @user它应该工作,因为然后Rails能够以正确的顺序保存它们,它知道它还没有保存,需要更新这些关系。