0

我在编写控制器操作时遇到问题,该操作将 Post id 作为参数传递并在发布之前将它们排序为特定顺序。

帖子有一个position属性(我使用acts_as_list 进行排序),并且要么已发布,要么未发布(可使用named_scopesPost.publishedPost.unpublished相应地搜索)。

本质上,有一个 JavaScript 接口允许用户将未发布的帖子拖到队列中,并通过将 id 作为post_ids参数传递给控制器​​方法来发布它们,如下所示:

def publish
  Post.update_all(['published=?', true], :id => params[:post_ids])
  redirect_to admin_path
end

发布这样的帖子效果很好。接下来我需要做的是按特定顺序按位置对帖子进行排序,这就是我遇到问题的地方。

假设用户将帖子 5、帖子 3、帖子 7 拖入队列并单击“发布”。

然后我想要做的是组织所有 Posts 在第一个位置按顺序排列 5、3、7,然后按照它们已经在的顺序排列其余 Post 对象,因此按 Post.position 排序将是[5, 3, 7, ...the rest of the posts in order here...]

然后,如果用户将两个新帖子拖入队列并单击“发布”(这次假设帖子 2 和 4),帖子应该按顺序排列[2, 4, 5, 3, 7, ...the rest of the posts in order here...]

最后一个例子,假设用户将帖子 10、1 和 12 移动到队列中并发布,顺序应该是[10, 1, 12, 2, 4, 5, 3, 7, ...the rest of the posts in order here...]等等......

我会展示我一直在处理的代码,但我不确定它是否会有所帮助,因为我还没有正确排序。但基本上我想这是一个取两个数组的问题,第一个是所有帖子,第二个是要发布的帖子,并将每个项目放在帖子发布数组中的所有帖子数组的开头,然后发布。我似乎无法让它工作。在这里的任何帮助将不胜感激,我提前感谢您的时间!

编辑 如果有帮助,这是我到目前为止编写的代码。在测试中,似乎此方法第一次正确地对队列中的帖子进行了排序,但是任何后续发布的帖子都不会移动到已发布帖子列表的前面。

def publish
  if params[:to_publish].present?
    # :to_publish are the posts dragged into the queue in order.
    # Here I'm cleaning up the Javascript input and then iterating 
    # through them to update their sort order.
    params[:to_publish].to_s.split(",").uniq!.each_with_index do |id, index|
      Post.update_all(['position=?', index + 1], ['id=?', id])
    end
  end
  # :post_ids are the posts to be published, order is irrelevant.
  # For client-side reasons they're passed as a separate parameter.
  Post.update_all(['published=?', true], :id => params[:post_ids])
  redirect_to admin_path
end
4

1 回答 1

0

参数[:to_publish].to_s.split(",").uniq!

在这里,你为什么要做独特的检查?是防御措施吗?

还要注意 uniq! 如果没有找到重复项,则返回 nil,这会导致您的代码在数组没有重复项时抛出 nil 引用错误。

如果你的代码中有一个救援块吞下了这个零引用错误,你就有麻烦了!

于 2010-08-29T18:25:03.717 回答