質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

1回答

1174閲覧

Railsのform_withでパリデーションエラーが二重に表示される

stks56

総合スコア15

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/05/01 21:38

編集2019/05/03 13:37

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

とした時のエラー内容です
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haneru

2019/05/02 13:09

Postモデルのバリデーションの実装を見せてください
stks56

2019/05/02 19:49

Postモデルのバリデーション内容を追記しました!よろしくお願いします。
haneru

2019/05/03 11:56

バリデーションの実装自体は問題なさそうですね。 それでは次はcreateアクションの`else`と`render("posts/new")`の間に`raise`を記述し、エラー画面上のコンソールで`@post.errors`をした際の出力結果を見せていただいてもよろしいでしょうか?
stks56

2019/05/03 13:39

web-consoleを知らなかったので調べました。 メソッドの下にconsoleと入れるとエラー画面が出るらしいのですが出ませんでした。なぜでしょう? gemfileにweb-consoleの記述はあります。
guest

回答1

0

(かなり古い質問のため、もう解決しておられるかもしれませんが、同じ悩みでこの質問にたどり着いた方もいらっしゃるかもしれませんので、一応回答させていただきます)

原因

Rails 5 から、

rb

1belongs_to :game

と書くと自動的に game に対する必須バリデーションを設定するようになっています。

今回は以下のように自前のバリデーションもつけちゃってるので、

rb

1validates :game_id, {presence: true}

必須のエラーメッセージが二重に出てしまっているものと思われます。

対策

モデルから以下の2行を削除してください。

rb

1 validates :game_id, {presence: true} 2 validates :user_id, {presence: true}

投稿2020/01/08 04:56

shinoharat

総合スコア1676

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問