Open neutral2010 opened 2 years ago
★ form_withはURLを生成するのにpolymorphic_pathを使っているpolymorphic_pathで思い通りのURLが生成できるかどうか試してみよう。
constantize
のような高度なテクニックを使わないrubocop
のスクショcreated_at
は自動生成される親はReportとBook 。Commentは子。外部keyが仮想親で親の種類を区別するtypeカラム。 子は仮想親に対してbelong_toメソッドを一つだけ設定、各親モデルが仮想親と自分自身のモデル名(クラス名)を関連づける
commentモデルを作成すると、、、、
カラムはcontent
以外に自動でcommentable_type
とcommentable_id
が生成される。
commentable_type
には、ReportもしくはBook のモデル名が入る。
→ どのモデルに対してのcommentなのかが分かる。commentabel_id
は、ReportもしくはBook のモデル名が入る。
→ そのモデルのどのidに対してのcommentなのかを判別する。Railsガイドより
rails g scaffold report title:string description:text user_id:integer
【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...
app/views/reports/index.html.erb
やapp/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
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.erb
のnotice
は削除して大丈夫ということだろう
やりたいことは、
❯ 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) ==========================
2つに分ける。
現在ログインしているユーザーをモデルオブジェクトとして利用できます。 関連付けがされている場合、子要素・親要素の取得などが可能です。
使いそうなコード
【Rails】 form_withの使い方を徹底解説! | Pikawaka