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

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

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

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

Ruby on Rails

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

2回答

1485閲覧

Formオブジェクトのバリデーションが読み込まれず困っています。

qwertyuiopp

総合スコア3

Ruby

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

Ruby on Rails

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

0クリップ

投稿2021/10/20 06:45

編集2021/10/20 07:03

前提・実現したいこと

現在、レシピ投稿アプリケーションのタグ付け機能を実装しています。
アプリケーション内容としては、レシピの投稿する際、タグをつけて投稿できる仕組みです。
Formオブジェクトを用いて記述を行ったのですが、投稿ボタンを押しても投稿・保存ができず困っています。

原因がお分かりになる方がいらっしゃいましたらご教授お願い致します。

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

デスクトップ・ターミナル共にエラーは出力されておりません。

該当のソースコード

recipes_controller

class RecipesController < ApplicationController before_action :move_to_index, except:[:index, :show] def index @recipes = Recipe.order('created_at DESC') end def new @recipe = RecipesTag.new end def create @recipe = RecipesTag.new(recipe_params) if @recipe.valid? @recipe.save return redirect_to root_path else render "new" end end ~~~~~~~省略~~~~~~~~ private def recipe_params params.require(:recipes_tag).permit(:title, :material, :text, :category_id, :time_require_id, :image, :name).merge(user_id: current_user.id) end

models.recipes_tag.rb

class RecipesTag include ActiveModel::Model attr_accessor :recipe_id, :user_id, :title, :material, :text, :category_id, :time_require_id, :image, :name with_options presence: true do validates :recipe_id validates :user_id validates :title validates :material validates :text validates :category_id validates :time_require_id validates :name validates :image end def save recipe = Recipe.create(recipe_id: recipe.id, user_id: user.id, title: title, material: material, text: text, category_id: category_id, time_require_id: time_require_id, image: image) tag = Tag.where(name: name).first_or_initialize tag.save RecipeTagRelation.create(recipe_id: recipe.id, tag_id: tag.id) end end

models.recipe.rb

class Recipe < ApplicationRecord extend ActiveHash::Associations::ActiveRecordExtensions ~~~省略~~~ has_many :recipe_tag_relations has_many :tags, through: :recipe_tag_relations

model.tag.rb

class Tag < ApplicationRecord has_many :recipe_tag_relations has_many :recipes, through: :recipe_tag_relations validates :name, uniquness: true end

view.recipes._form.rb

<%= form_with model: @recipe, url: recipes_path, local: true do |f| %> ~~~省略~~~ <div class="field"> <div class="tag-field", id='tag-field'> <%= f.label :name, "タグ", class:"tag-name" %><br /> <%= f.text_field :name, placeholder: "#時短レシピ(複数入力可)", class:"input-tag" %> </div> </div> ~~~省略~~~ <% end %>

試したこと

recipes_controllerのcreateメソッド内でbinding.pryを記述し中身の確認を行ったところ、paramsと@recipeともにデータは入っていました。
@recipe.valid? では false で返ってきたため、バリデーションに問題があると思いましたが、バリデーションの記述にミスはないように思いました。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

自己解決

recipe_idを保存していないのにバリデーションに記述してしまっていた為に起こったエラーでした。
中間テーブルとFormオブジェクトを使用する際はバリデーションと保存するカラムの記述に気をつけます。。

投稿2021/10/20 08:57

qwertyuiopp

総合スコア3

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

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

0

@recipe.valid? では false で返ってきたため、バリデーションに問題があると思いましたが

validation失敗したではないですか?errorsで確認してみて、どのエラーか特定できます。

ruby

1@recipe.errors

validation失敗する場合は、newをrenderしてるため、errosをnewテンプレートで表示したら分かりやすいと思います。

new.html.erbファイルへこちらを追加すれば、エラーが表示されます。

erb

1<ul> 2 <% @recipe.errors.full_messages.each do |msg| %> 3 <li><%= msg %></li> 4 <% end %> 5</ul>

投稿2021/10/20 07:46

heroyct

総合スコア434

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

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

qwertyuiopp

2021/10/20 08:01

有難うございます。 提案いただきました方法を実行したところ、Recipe can't be blank と表示されました。 Formオブジェクトで定義していますRecipeを順を追って確認しましたが、どの部分のRecipeも定義ができているように思い、特定が難しい状態です。。。 原因がお分かりになるようであれば、お手数ですがご教授お願い致します。
heroyct

2021/10/20 08:13

``` with_options presence: true do validates :recipe_id ``` 定義する通り、recipe_idがないです。 RecipesTag保存するなら、RecipeTagControllerで処理すべきだと思います。 後変数を@recipeから@recipe_tagへ変更した方がわかりやすいです。 ``` def create @recipe = RecipesTag.new(recipe_params) if @recipe.valid? @recipe.save return redirect_to root_path else render "new" end end ```
qwertyuiopp

2021/10/20 08:17

返信有難うございます。 中間テーブルとFormオブジェクト(RecipesTag)を用いて実装を行いたかったのですが、コントローラーも作成しなければならないのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問