errors.full_messages.eachを回してformにバリデーションエラーを表示しているのですが、二重に表示されてしまい困っています。
new.html.erb
<div class="main-wrapper"> <div class="post-new-container"> <h2>投稿する</h2> <%= render "form", post: @post %> </div> </div>
_form.html.erb
<div class="form"> <% post.errors.full_messages.each do |message| %> <div class="error"> <%= message %> </div> <% end %> <%= form_with(model: post, local: true) do |f| %> <div class="field"> <%= f.label :title %><br /> <%= f.text_field :title, class: "title"%> </div> <div class="field"> <%= f.label :game_id %> <%= f.collection_select :game_id, Game.all, :id, :name, prompt: true %> </div> <div class="field"> <%= f.label :content %> <%= f.text_area :content %> </div> <div class="actions"> <%= f.submit "投稿", class: "submit-btn" %> </div> <% end %> </div>
ルーティング
resources :posts
posts_controller.rb
class PostsController < ApplicationController before_action :authenticate_user!, {only: [:new, :create, :edit, :update, :destroy]} before_action :ensure_correct_user, {only: [:edit, :update, :destroy]} def index @posts = Post.page(params[:page]).per(10).order("created_at desc") end def show @post = Post.find_by(id: params[:id]) end def new @post = Post.new end def create @post = Post.new(post_params) @post.user_id = current_user.id if @post.save flash[:notice] = "記事を投稿しました" redirect_to("/posts") else render("posts/new") end end def edit end def update if @post.update(post_params) flash[:notice] = "記事を編集しました" redirect_to("/posts/#{@post.id}") else render("posts/edit") end end def destroy @post = Post.find_by(id: params[:id]) @post.destroy flash[:notice] = "記事を削除しました" redirect_to("/posts") end def ensure_correct_user @post = Post.find_by(id: params[:id]) if current_user.id != @post.user_id flash[:notice] = "権限がありません" redirect_to("/") end end private def post_params params.require(:post).permit(:title, :game_id, :content) end end
postsのスキーマ
create_table "posts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.text "title" t.text "content" t.integer "game_id" t.integer "user_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false end
考えられること
恐らくcollection_selectで他モデルのDBのデータを参照して表示している点がおかしいと思うのですが二重になる意味がちょっとわかりません。
form自体は正常に投稿できます。
アドバイスいただけると幸いです。
よろしくお願いします。
追記
Postモデルのバリデーション内容です
class Post < ApplicationRecord validates :title, {presence: true} validates :content, {presence: true} validates :game_id, {presence: true} validates :user_id, {presence: true} belongs_to :user belongs_to :game has_many :likes accepts_nested_attributes_for :likes has_many :users, through: :likes end
追記
def create console @post = Post.new(post_params) @post.user_id = current_user.id if @post.save flash[:notice] = "記事を投稿しました" redirect_to("/posts") else raise render("posts/new") end end
バリデーションの実装自体は問題なさそうですね。
それでは次はcreateアクションの`else`と`render("posts/new")`の間に`raise`を記述し、エラー画面上のコンソールで`@post.errors`をした際の出力結果を見せていただいてもよろしいでしょうか?
web-consoleを知らなかったので調べました。
メソッドの下にconsoleと入れるとエラー画面が出るらしいのですが出ませんでした。なぜでしょう?
gemfileにweb-consoleの記述はあります。