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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

1回答

1332閲覧

Ruby on Railsのフォームオブジェクトのエラーについて

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/04/03 13:32

Ruby on Railsのフォームオブジェクトの関連付けについて質問があります。
https://teratail.com/questions/250421
上記のURLの続きの内容となります。

post_article_controller.rb def new @post_article_form = PostArticleForm.new end def create @post_article_form = PostArticleForm.new @post_article_form.assign_attributes(params[:form]) # ここでタグの文字列をパラメータでFormに送信しています @post_article_form.assign_tags(params[:tag_list]) @post_article_form.post_article.poster = current_user if @post_article_form.save redirect_to :root, notice: "投稿しました。" else render 'new' end end
post_article.rb def save_tags(tags) current_tags = self.tags.pluck(:name) unless self.tags.nil? old_tags = current_tags - tags new_tags = tags - current_tags # タグの削除 old_tags.each do |old_name| self.tags.delete(Tag.find_by(name: old_name)) end # タグの追加 new_tags.each do |new_name| tagging = Tag.find_or_create_by(name: new_name) self.tags << tagging end end
class PostArticleForm delegate :save, to: :post_article def initialize(post_article = nil) @post_article = post_article @post_article ||= PostArticle.new (5 - @post_article.photos.size).times do @post_article.photos.build end # ここでタグを生成しています @post_article.tags.build unless @post_article.tags.present? end def assign_tags(tag_list) tag_list = tag_list.split(",") post_article.save_tags(tag_list) # binding.pryでここで止めると以下のように目的のタグ以外にidがnilのタグが作成されています。 # コンソール => [#<Tag:0x007ffd242a34c8 id: nil, name: nil>, #<Tag:0x007ffd25ed34e0 id: 10, name: "入力したタグ名">] end

上記の、[#<Tag:0x007ffd242a34c8 id: nil, name: nil>, #<Tag:0x007ffd25ed34e0 id: 10, name: "入力したタグ名">]の部分にnilが入ってしまっているため「Field 'name' doesn't have a default value」というエラーが出てしまいタグの保存ができません。

何故でしょうか?

大変お手数をお掛けしますが、どなたかご教授の方をよろしくお願い致します

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

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

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

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

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

guest

回答1

0

params[:tag_list]の値を確認してみましょう。
この場合は「入力したタグ名,」等の入力をしたように思えます。
post_article_form.rbのassign_tagsで、上記の値に対してsplit(",")を実行した結果が["", "入力したタグ名"]になった結果、nameが空のpost_article_tagsを生成しようとしています。
おそらくpost_article_tagsのテーブルにはnull: falseな制約がついており保存が失敗した結果、nilのTagが生成されたように思えます。

モデル内でself.tags.nil?でnilチェックを行っているようですが、実は空の文字列でnil?をやってもfalseが帰ります。からの文字列も弾きたい場合はself.tags.blank?を使うといいでしょう。

投稿2020/04/03 20:49

mottox2

総合スコア299

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

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

退会済みユーザー

退会済みユーザー

2020/04/03 22:07

ご回答ありがとうございます! params[:tag_list]の中身は"入力した文字列"になっていまして""の空文字にはならないです。 split(",")を実行した結果も["入力したタグ名"]になっております。 また、モデル内でself.tags.blank?を使っても同じエラーが発生致します。
退会済みユーザー

退会済みユーザー

2020/04/04 07:12 編集

モデルのsave_tagsメソッドに飛んでいる引数も["入力したタグ名"]になっております。 idがnilのtagはそのまま残っている状態です。save_tagsメソッドの処理が完了しても [#<Tag:0x007ffd242a34c8 id: nil, name: nil>, #<Tag:0x007ffd25ed34e0 id: 10, name: "入力したタグ名">]とidがnilのtagはそのまま残っている状態です。何故でしょうか?
退会済みユーザー

退会済みユーザー

2020/04/04 14:02 編集

ちなみに、assign_tagsのメソッドを以下のように修正し、一回tagを全て削除するという方法にすると、idがnilのtagが消えて上手くいくのですが、少し考え方が無理やりな感じがします。 def assign_tags(tag_list) tag_list = tag_list.split(",") post_article.save_tags(tag_list) post_article.tags.each do |tag| post_article.tags.delete(tag) end end
退会済みユーザー

退会済みユーザー

2020/04/04 15:55 編集

しかし、上記のようにすると 1つタグを入力した場合には上手く動きますが、 2つ以上タグを入力した場合は最初の1つ目のタグしか登録されないため やはり上手く動きません。
mottox2

2020/04/06 18:39

返信が遅れました。 改めて見ると`@post_article.tags.build`を実行していてその時点で空のTagが生成されている気がします。 このあたりが原因ではないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問