超絶駆け出しエンジニアの自分のための備忘録
超初心者がスクールの教材やネット検索を駆使して、不格好なブログアプリを作成する道のり その5
postsのルーティングを設定する
app/config/routes.rb に
resorces: posts
と記述を加えることでpostsのルーティングが設定できます
Deviseでログインしないとpostsコントローラを呼び出せないように編集
app/controllers/posts_controller.rb に
before_action :authenticate_user!
を書き加えます。
ちなみに書き加えたあとの内容は
class Postscontroller < ApplicationController
before_action :authenticate_user!
before_action :set_posts, only: [:show, :edit, :update, :destroy]
となっています。
上記の内容で各アクションが実行される前にbefore_actionの引数が呼び出されます。
before_actionでauthenticate_user! を追加したことでログインしてないユーザーはrootページにリダイレクトされます。
Postの呼び出しをcurrent_user経由にする
@posts = post.all という表記のままだと、誰かが投稿した記事をユーザー全員が閲覧できてしまうので、
@posts = current_user.posts と表記を変えます。
current_userとはログインしているユーザーのことです。
なので、
@post = Post.new
@post = Post.new(post_params)
を
@post = current_user.Post.new
@post = current_user.Post.new(post_params)
に書き換え
set_postメソッドを追加する
before_actionで呼び出すset_postがnilだった場合、リダイレクトするとエラーが出るので、findからfind_byにする
app/controllers/posts_controller.rb のprivateメソッドのところに
def set_post
@post = current_user.posts.find_by(id: params[:post_id])
redirect_to(posts_url, alert: "ERROR!!" if @post.blank?)
end
を追記します。
has_manyとbelongs_toで関連付ける
作るアプリでは1人のuserが複数のpostを持つという構造なのでモデルとデータベースにそれぞれ記述を加えます。
app/models/user.rb に
has_many :posts
app/models/posts/rb に
belongs_to :user
をそれぞれ書き加え、関連性を持たせます、
db/migrate/作った日付_create_posts.rb に
t.reference :user, foreign_key :true,
を書き加えます。
t.reference :user
を記述することでuser_idというカラムを作成し、自動でindexを付与してくれます。
indexが付与されることでindexで検索ができるようになり、全部のデータを調べなくても高速で調べることが可能になります。
foreign_key :true
を記述することで外部キー制約をつけます。
データベースレベルでuser_idにはusers.idにある値しか入れなくなります。
バリデーションの追加
app/models/post.rb に
validates :content, presence :true
を追記します。
これで空欄で入力できないようにしました。
いったん一区切り。
また、超絶駆け出しエンジニアなので、突っ込みどころがあればご指導・ご鞭撻いただけると幸いです。