0

在控制器中,特别是编辑操作中,我以与以下相同的方式创建了一个新的 Active Record 模型:

@newPost = Post.new
@newPost.update_attribute(:title, @some_title)
@newPost.update_attribute(:completed, 0)
@newPost.save

@all_user_posts = @user.posts 

现在,当我尝试调用 @all_user_posts 并将其显示在视图中时,除非我刷新页面,否则它不会显示。这里发生了什么,有没有更好的方法来解决这个问题,以便我可以在创建新帖子后立即显示它们而无需刷新页面?

4

2 回答 2

0

我想我实际上可以这样做:

@all_user_posts = Post.where("user_id =?", @user.id)

但是,有人还能解释为什么会这样吗?

于 2013-08-09T19:00:15.640 回答
0

我相信在您创建新帖子之前,您确实喜欢

@user = User.find(parmas[:id])

这意味着对象已加载到内存并分配给变量。当您创建帖子时(顺便说一句,您在哪里将其分配给用户?)从数据库加载的对象不会再次重新加载,而是在它位于内存中时被使用(它已被缓存)。

这应该有效:

@all_user_posts = @user.posts(true)

这将强制重新加载关联。

更重要的一点:永远不要使用 update_attribute 方法,因为: 1. 它正在保存一个对象(这不是这个方法的真正问题,只是值得知道它) 2. 它跳过验证!

而是使用 assign_attributes 方法,该方法接受属性哈希并且不保存对象。但是由于您正在保存它,您还可以使用 update_attributes 方法(注意末尾的“s”),它实际上运行 assign_attributes 然后保存记录(3 行合一,是的!)。您可以更进一步并在 Post 类上使用 create 方法,该方法 1. 创建新对象 2. 传递哈希的 Assign_attributes 3. 保存对象(不跳过验证)

所以前 4 行可以写成一行:

@newPost = Post.create(:title => @some_title, :completed => 0)

另一点:注意 ruby​​ 命名约定。应该有@new_post

最后一个:您是否真的在视图中使用了所有这些变量(@newPost、@some_title、@user 和 @all_user_posts)。如果没有,则无需在它们前面添加@符号。另外我不确定你需要什么 @all_user_posts 变量,你可以简单地在你的视图中使用 @user.posts 。

于 2013-08-09T21:39:52.927 回答