#構築環境
macOS Big sur
ruby 2.6.5
rails 6.0.0
#何があったのか
最初は、
こんな感じで、paramsが入っていないっていうエラー。しかしcontrollerを見てみてもおかしいところはなさそう
しかし、おかしいところを見つけましたね。
controllの記述を間違えてしまいました。
↓こちらは修正前の、投稿に関するcontroller
class PostsController < ApplicationController
before_action :authenticate_user!
before_action :find_post, only: [:edit, :update, :show, :destroy]
def index
@posts = Post.all
end
def new
@post = Post.new
end
def edit
@post = Post.find(post_params)
end
def create
return redirect_to new_profile_path,alert: "プロフィールを登録してください" if current_user.profile.blank?
@post = current_user
@post = Post.create params.require(:post).permit(:content, images: [])
if @post.save
redirect_to root_path,notice:'投稿に成功しました'
else
render :new
end
end
def update
if @post.update(post_params)
redirect_to root_path
else
render :edit
end
end
def destroy
if @post.destroy
redirect_to root_path,alert: '投稿を削除しました'
else
redirect_to root_path
end
end
private
def post_params
params.require(:post).permit(:content, images: [])
end
def find_post
@post = Post.find(params[:id])
end
def force_redirect_unless_my_post
return redirect_to root_path,alert:'権限がありません'if @post.user != current_user
end
end
修正後↓
class PostsController < ApplicationController
before_action :authenticate_user!
before_action :find_post, only: [:edit, :update, :show, :destroy]
def index
@posts = Post.all
end
def new
@post = Post.new
end
def edit
@post = Post.find(post_params)
end
def create
return redirect_to new_profile_path,alert: "プロフィールを登録してください" if current_user.profile.blank?
@post = current_user
@post = Post.create params.require(:post).permit(:content, images: [])
if @post.save
redirect_to root_path,notice:'投稿に成功しました'
else
render :new
end
end
def update
if @post.update(post_params)
redirect_to root_path
else
render :edit
end
end
def destroy
if @post.destroy
redirect_to root_path,alert: '投稿を削除しました'
else
redirect_to root_path
end
end
private
def post_params
params.require(:post).permit(:content, images: [])
end
def find_post
@post = Post.find(params[:id])
end
def force_redirect_unless_my_post
return redirect_to root_path,alert:'権限がありません'if @post.user != current_user
end
end
20行目の、
@post = Post.create.params.require(:post).permit(:content, images: [])
の部分を、
@post = Post.create params.require(:post).permit(:content, images: [])
に変えました。
上の間違った文章だと、Postのcreateメソドッドのparamsを撮ってこいってなってしまうので、そりゃあparamsなんてないよって上のエラーの画像みたいに怒られるでしょうね。
しかし、したのようにしたことで、Post.create
と、paramsのストラロングパラメーターの部分と分離するという本来伝えたかった意味になるので、通ったわけです。
もうひとつやったことがありました。
class Post < ApplicationRecord
has_many_attached :images
belongs_to :user, optional: true
end
modelの部分のアソシエーションは、userと結びつけていますなので、userと投稿であるpostは、1対多になります
↓が、userに関するmodelです。deviceを使っているので、それに関する記述がありますがここでは説明しないので気にしないでください
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
has_many :posts
has_one :profile, dependent: :destroy
end
has_many :posts
としているので、userは、一人でもたくさんの投稿ができるようになっています。
下が
class Post < ApplicationRecord
has_many_attached :images
belongs_to :user, optional: true
end
optional: true
をuserにつけることで、親クラス(user)の外部キーのnilを許可するようにすることで、投稿機能の中にあるsave
メソッドをきのうさせることができました。