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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1617閲覧

rails Validation failedを解決したいです。

numazuki

総合スコア5

Ruby on Rails 5

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/12/28 05:37

前提・実現したいこと

ユーザーの投稿(post)にタグ(tag)を1つ付けるようにしたいです。
投稿は必ずタグを付けるようにしたいです。
タグはシードデータを用意してあり、投稿ページからform.collection_selectを用いて送っています。

発生している問題・エラーメッセージ

Validation failed: Tag must exist Parameters: {"utf8"=>"✓", "authenticity_token"=>"bo5kzmM4xklO+a+e0WxdoAzzOIrvKdBtbGQdiMFFq2Q/lum3jBOkqm/gExxaM42YEQMiMIXe9MhnhAfVK9uQfg==", "post"=>{"tag_id"=>"6", "sake_name"=>"d", "meshi_name"=>"d", "content"=>"d"}, "commit"=>"投稿"}

該当のソースコード

class PostsController < ApplicationController def new @post = current_user.posts.build end def create @post = current_user.posts.build(post_params) @post.tag_id = params[:tag_id] if @post.save! flash[:success]="maru" redirect_to root_url else flash[:danger]="batsu" render :new end end private def post_params params.require(:post).permit(:sake_name,:meshi_name,:img,:content,:tag_id) end end
投稿ページ View <%= form_with(model: @post, local: true) do |f| %> <%= render 'layouts/error_messages', model: f.object %> <%= f.label :tag, 'タグ' %> <%= f.collection_select(:tag_id, Tag.all, :id,:name) %> <%= f.submit '投稿'%> <% end %>
Postモデル class Post < ApplicationRecord belongs_to :user belongs_to :tag validates :content, presence: true, length: { maximum: 400 } validates :sake_name, presence: true, length: { maximum: 50 } validates :meshi_name, presence: true, length: { maximum: 50} end
モデル class Tag < ApplicationRecord has_many :posts end

試したこと

rails consoleを使っての投稿はできました。
binding.pryで確認しましたが、tag_idは送られてませんでした。

pry(#<PostsController>)> params => <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"XNiuki0Y6vKEOjIrHZq08PSQ6/GjTfdlJefZzzpL8j1/61oxjRTS5iDr39+oIK9Qw2NrgrcUutyZ+KSEkTRoOw==", "post"=><ActionController::Parameters {"tag_id"=>"2", "sake_name"=>"a", "meshi_name"=>"a", "content"=>"a"} permitted: false>, "commit"=>"投稿", "controller"=>"posts", "action"=>"create"} permitted: false> [2] pry(#<PostsController>)> post_params => <ActionController::Parameters {"sake_name"=>"a", "meshi_name"=>"a", "content"=>"a", "tag_id"=>"2"} permitted: true> [3] pry(#<PostsController>)> @post => #<Post:0x00007f3c1507dac0 id: nil, sake_name: "a", meshi_name: "a", content: "a", img: nil, user_id: 1, tag_id: nil, created_at: nil, updated_at: nil>

PostモデルとTagモデルの関連が上手くできていないのかなとは思うのですがやり方がわかりません。
お手数ですが回答よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

rails5.2.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

def create @post = current_user.posts.build(post_params) @post.tag_id = params[:tag_id]

ここの部分ですが,@post.tag_id = params[:tag_id]ではなくparams[:post][:tag_id]が正しいです。
(binding.pryでparams[:post][:tag_id]とparams[:tag_id]をそれぞれ試してみてください。params[:tag_id]=nilになっているはずです)

また,@post = current_user.posts.build(post_params)の時点ですでに@postにtag_idも登録されているはずなのでそもそも@post.tag_id = params[:post][:tag_id]の記述がなくても上手くいくと思います。

投稿2019/12/28 07:30

k-810

総合スコア192

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

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

numazuki

2019/12/28 07:39

回答ありがとうございます! params[:post][:tag_id]にした場合も@post.tag_idの記述がなくても上手くいきました。 余計な文を書いてしまったみたいです。 助かりました! また、paramsの記述方法も復習してみます!
k-810

2019/12/28 07:43

よかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問