0
0

More than 3 years have passed since last update.

[Rails]謎のデータが追加されている

Last updated at Posted at 2020-06-08

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」と表示されてしまいます。

0
0
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0