neutral2010 / log

作業用のissueを立てるためのリポジトリ
0 stars 0 forks source link

「コメントをつけられるようにする」 #6

Open neutral2010 opened 2 years ago

neutral2010 commented 2 years ago

使いそうなコード

【Rails】 form_withの使い方を徹底解説! | Pikawaka

def new
  @article = Article.find(params[:article_id])
  @comment = Comment.new
end

def edit
  @article = Article.find(params[:article_id])
  @comment = Comment.find(params[:id])
end
neutral2010 commented 2 years ago

学習の狙い

実装すること

★ form_withはURLを生成するのにpolymorphic_pathを使っているpolymorphic_pathで思い通りのURLが生成できるかどうか試してみよう。

注意点

neutral2010 commented 2 years ago

タスク分割

[x] reports(日報)に関すること

[x] コメントと日報・本との関連付け

[x] コメントと日報・本との関係

[x] ユーザーとの関係

[x] コメント自体に関すること

見た目に関すること

neutral2010 commented 2 years ago

ポリモーフィックについて学ぶ

Railsのポリモーフィック関連について - Qiita

親はReportとBook 。Commentは子。外部keyが仮想親で親の種類を区別するtypeカラム。 子は仮想親に対してbelong_toメソッドを一つだけ設定、各親モデルが仮想親と自分自身のモデル名(クラス名)を関連づける

commentモデルを作成すると、、、、

カラムはcontent以外に自動でcommentable_typecommentable_idが生成される。

Railsガイドより image

neutral2010 commented 2 years ago

参考にしたサイト

neutral2010 commented 2 years ago

日報機能作成

rails g scaffold report title:string description:text user_id:integer

image

【2022.07.09追記】 この時点ではuser_idは不要と思う根拠(以下の自分の日報からの引用)があるので rails g scaffold report title:string description:textで作成。

Reportモデルにuser_idを持ってくるにはどうしたらいいんだろう?と思って、ReportモデルとUserモデルの関係について、理解する必要が生じたかと思ったが、current_userについてあらためて調べてみて、これはRails deviseで使えるようになるヘルパーメソッドのひとつで、

現在ログインしているユーザーをモデルオブジェクトとして利用できます。
関連付けがされている場合、子要素・親要素の取得などが可能

とのこと。これを使えば「自分しか自分の日報の操作はできない。」の実装は可能なのではと思って一旦Userモデルとの関連付けは必要ないと考えた。もし必要だったら関連づけでUserモデル方取得した方が良いだろう。なぜかReportモデルにuser_idカラムが作成されているので削除。削除してみると、なるほどやはりいずれUserモデルとの関連付けをやらないといけなさそうなのが分かったが、それは後でよさそうな気がした


~/fBootcamp/fjord-books_app my-comments
❯ rails g scaffold report title:string description:text
Running via Spring preloader in process 24021
      invoke  active_record
      create    db/migrate/20220709012500_create_reports.rb
      create    app/models/report.rb
      invoke    test_unit
      create      test/models/report_test.rb
      create      test/fixtures/reports.yml
      invoke  resource_route
       route    resources :reports
      invoke  scaffold_controller
      create    app/controllers/reports_controller.rb
      invoke    erb
      create      app/views/reports
      create      app/views/reports/index.html.erb
      create      app/views/reports/edit.html.erb
      create      app/views/reports/show.html.erb
      create      app/views/reports/new.html.erb
      create      app/views/reports/_form.html.erb
      invoke    resource_route
      invoke    test_unit
      create      test/controllers/reports_controller_test.rb
      create      test/system/reports_test.rb
      invoke    helper
      create      app/helpers/reports_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/reports/index.json.jbuilder
      create      app/views/reports/show.json.jbuilder
      create      app/views/reports/_report.json.jbuilder
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/reports.scss
      invoke  scss
    conflict    app/assets/stylesheets/scaffolds.scss
  Overwrite /Users/usagi/fBootcamp/fjord-books_app/app/assets/stylesheets/scaffolds.scss? (enter "h" for help) [Ynaqdhm] q
  Aborting...
neutral2010 commented 2 years ago

日報は更新・削除できるのは本人のみ

viewでcurrent_userのみにしか、リンクが出ないようにする。

app/views/reports/index.html.erbapp/views/reports/show.html.erb

コントローラでも編集と削除ができないようにしておく

# これはコメントに関するコード
class CommentsController < ApplicationController
  before_action :correct_user,   only: %i[edit update destroy]

  # 省略

  private

  def set current_user
    comment = Comment.find(params[:id])
    redirect_to(root_url) unless comment.user_id == current_user.id
  end
end
neutral2010 commented 2 years ago

noticeが2つ出てしまう。

deviseの時も起こっていたよう。 https://github.com/neutral2010/log/issues/3#issuecomment-1078631160

noticeが2つ出てしまう。 app/views/layouts/application.html.erbで対応した。 → 多分ここにあるから、app/views/reports/show.html.erbnoticeは削除して大丈夫ということだろう

やりたいことは、

neutral2010 commented 2 years ago

コメントモデル作成

❯ rails g model comment content:text commentable:references{polymorphic}

Running via Spring preloader in process 82825
      invoke  active_record
      create    db/migrate/20220605143557_create_comments.rb
      create    app/models/comment.rb
      invoke    test_unit
      create      test/models/comment_test.rb
      create      test/fixtures/comments.yml

~/fBootcamp/fjord-books_app my-comments*
❯ db:migrate
zsh: command not found: db:migrate

~/fBootcamp/fjord-books_app my-comments*
❯ rails db:migrate
== 20220605143557 CreateComments: migrating ===================================
-- create_table(:comments)
   -> 0.0036s
== 20220605143557 CreateComments: migrated (0.0037s) ==========================
neutral2010 commented 2 years ago

コメントのコントローラー

2つに分ける。

neutral2010 commented 2 years ago

current_userって何?current

現在ログインしているユーザーをモデルオブジェクトとして利用できます。 関連付けがされている場合、子要素・親要素の取得などが可能です。

https://qiita.com/tobita0000/items/866de191635e6d74e392 より