fluid_27’s blog

勉強した内容をアウトプットするためのブログ

ブログアプリ作成⑤ ルーティング

超絶駆け出しエンジニアの自分のための備忘録

 

超初心者がスクールの教材やネット検索を駆使して、不格好なブログアプリを作成する道のり その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

を追記します。

これで空欄で入力できないようにしました。

 

いったん一区切り。

また、超絶駆け出しエンジニアなので、突っ込みどころがあればご指導・ご鞭撻いただけると幸いです。