[Rails]空の配列が文字列として認識されてしまいます。。。
Q&A
Closed
解決したいこと
Ruby on Railsで料理投稿のようなWebアプリをつくっています。
投稿機能の実装の際に、以下の問題が発生しました。
ストロングパラメーターで配列を扱う際に、空の配列が文字として認識されてしまい、
バリデーション(presence true)が機能せず困っております。
空の配列が認識されず、しっかりとバリデーションが機能する方法教えていただけると助かります。
発生している問題
テキストが空の状態で料理投稿を実行すると上記画像のような状態が発生してしまいます。
[""]がテキストとして認識されて、テキストエリアに表示されてしまいます。
想定する挙動としては、空で送信しているのでバリデーション(presence true)が働いて、エラーメッセージが表示される想定なのですが、[""]がテキストとして認識されバリデーションが機能していません。
該当するソースコード
def new
@food = FoodIngredientRecipe.new
end
def create
@food = FoodIngredientRecipe.new(food_params)
if @food.valid?
@food.save
redirect_to root_path
else
render :new
end
end
private
def food_params
params.require(:food_ingredient_recipe).permit(:title, :cook_time_id, :cost_id, :comment, :serving, mages: [], text: []).merge(user_id: current_user.id)
end
フォームオブジェクトを使用して、複数テーブルに保存しています。
また配列としてデータを保存したくないのでループして一つ一つ保存しています。
class FoodIngredientRecipe
include ActiveModel::Model
attr_accessor :title, :images, :cook_time_id, :cost_id, :comment, :user_id, :serving, :text
with_options presence: true do
validates :title
validates :images
validates :cook_time_id
validates :cost_id
validates :comment
validates :user_id
validates :serving
validates :text
end
def save(amount)
food = Food.create(title: title, images: images, cook_time_id: cook_time_id, cost_id: cost_id, comment: comment, user_id: user_id, serving: serving)
text.length.times do |i|
recipe = Recipe.new
recipe.food_id = food.id
recipe.text = text[i]
recipe.save
end
end
end
<div class="form">
<%= f.text_area :text, name: "food_ingredient_recipe[text][]", class:"recipe-text", placeholder:"例) 玉ねぎは1cmの厚さの輪切りにし、小麦粉大さじ1をまぶす。" ,rows:"4" ,maxlength:"100" %>
</div>
自分で試したこと
強制的にエラーを発生させ、パラメータの中身等を確認したところ、パラメータとして送信はされているようです。
しかし、空の場合も[""]が送信されていることになってしまっているようです。