Rails 直打ち禁止の方法 (URL入力で他人の編集画面へ遷移させない)


 直打ち禁止ってなんだ

プログラミング歴が7ヶ月と、まだまだ右も左もわかりません。
課題をこなしてく中で、「投稿者のみが編集や削除ができるように設定してください。」という条件がありました。
これを、 直打ち禁止というそうです(URLに直接 https:///XXX/edit と打ち込むことで他人の投稿を編集できちゃから、、、直打ち?)。

なるほどなぁ...と想いながら月日が経って、ポートフォリオを作成する時期になり、完成後に直打ちできちゃうことが判明。
うっかり忘れてしまっていたので、備忘録として直打ち禁止の方法を記録します。

ログインしていない状態だと、「投稿者のみ」という判断ができないので、ログイン機能がないアプリやホームページはどうやるんだろうか。それは今後、調べて学んでいきます。
(ちなみに、それで直接予約サイトへ飛べちゃうので困ってる会社さんがいました...。)

とにかく、直打ち禁止をするのは簡単にもかかわらず、うっかり忘れてしまって結構大変なことになるので、忘れちゃいけない機能です!

直打ち禁止のコード

まず、application_controllerに、before_actionメゾットを追加します。

application_controller.rb
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?

次に、直打ち禁止させたいcontrollerページを開きます。
(例えば、Postという名前の投稿ページだったら、post_controller.rb)

post_controller.rb
class PostsController < ApplicationController
    before_action :authenticate_user!
    before_action :correct_post,only: [:edit,:XXX]

ちなみに、before_action :authenticate_user! は、ログインしているユーザーのみ使えるようにする!という意味です。

before_action :correct_post,only: [:edit,:XX]を追加します。
:XXは他にも、直打ちしたくないアクションを追加します。

また、同じpost_controller.rbの下(privateより上)に下記のコードを追加します。

post_controller.rb
def correct_post
        @post = Post.find(params[:id])
    unless @post.user.id == current_user.id
      redirect_to posts_path
    end
end

redirect_to posts_path は、投稿者以外が直打ちした場合、飛ばすリンク先を記載してください。
以上で、直打ち禁止ができると思います!

ちなみに、correct_postと似ているのでcurrent_postというのがあります。
そのおかげで、私は頭の中がごちゃごちゃになってしまい、直打ち禁止のコード書いてるのになんで禁止されないんだ!と数分頭を抱えちゃってました。

こちらも合わせて気をつけたい点です。