Railsチュートリアルを終え、掲示板機能を追加してみようとしています。
やりたかったことは、2つの異なるモデルのコレクションをcreated_atでソートしてまとめて表示したいということですが、よくわからない現象のメモです。
とりあえず解決したのですが、どこか間違っていたら教えて下さい。
追記: turbolinksを無効にしたらまともになりました。
謎のデータは追加されていなさそうですし、ブラウザバックがおかしいのも、フォームに「Content can't be blank」と表示されることもなくなりました。
コードが長いのでまずは飛ばしてください。
def show
@bbs_thread = BbsThread.find(params[:id])
@user = current_user
if @user
@bbs_post = @user.user_posts.build(bbs_thread: @bbs_thread)
else
# @bbs_post = AnonymousPost.new # (1)
@bbs_post = @bbs_thread.anonymous_posts.build # (2)
password_for_delete = cookies.permanent.signed[:password_for_delete]
unless password_for_delete
password_for_delete = AnonymousPost.new_token
cookies.permanent.signed[:password_for_delete] = password_for_delete
end
@bbs_post.password = password_for_delete
end
puts "----- #{@bbs_thread.anonymous_posts.to_a.count} -----"
puts "===== #{@bbs_thread.anonymous_posts.count} ====="
@all_posts = @bbs_thread.user_posts + @bbs_thread.anonymous_posts
# @all_posts.sort! do |f,s|
# if !f || !f.created_at
# 1
# elsif !s || !s.created_at
# -1
# else
# f.created_at <=> s.created_at
# end
# end
@all_posts.sort! do |f,s|
f.created_at <=> s.created_at
end
@all_posts = @all_posts.paginate(page: params[:page])
end
(1)
と(2)
の部分なのですが、@bbs_post
というのはパーシャルでのフォーム用の変数です。
Railsチュートリアルでも、終盤のマイクロポストでは紐付けが便利?なためか(2)
の書き方をしていると思います。
しかし、なぜか(2)
の書き方だとputs
で表示しているカウントが変わってしまいます。
(1)
の書き方で2と2であれば、(2)
の書き方だと3と2になってしまいます。
追加されたものを見てみるとcreated_atなどがnilのものです。
# <AnonymousPost id: nil, name: nil, content: nil, password_digest: "$2a$10$roGsmjhYWRCah/3im5..1.W0e2g0dgZULkZY3oQHvLo...", bbs_thread_id: 40, post_number: nil, created_at: nil, updated_at: nil>
to_a
だけでなく、+
を利用した場合でも追加されてしまい、sort!
は例外で落ちます。
何が起きているのが自分にはわからないのですが、とりあえず(1)
の書き方で解決しました。
なにか根本的に理解できていないのかもしれません。
(2)
でもコメントアウトしたsort!
を用いれば、強引に動きはするのですが、フォームには「Content can't be blank」と表示されてしまいます。