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

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

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

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

Q&A

解決済

1回答

3178閲覧

カラムに入っている[]を外す方法を教えてください

rui-watanabe

総合スコア18

Ruby on Rails 5

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

0グッド

1クリップ

投稿2019/08/20 00:52

前提・実現したいこと

Rails初心者です。
複数画像選択の実装をしていて、保存には成功したのですが、カラムに[""]が入ってしまいます。
createメソッドが実行する前にこのカッコを外したいのですが、やり方がわからず質問させていただきました。

どなたかわかる方がいらっしゃいましたら、ご回答いただけると非常に助かります。

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

複数画像選択で、カラム保存の時["couple-260899_1920.jpg"]などとはいってしまうので余計なものを外したい。

products_controller

省略 def new @product = Product.new @product.product_images.build end def create @product = current_user.products.build(product_params) unless @product.valid? render "/products/new" else @product.save redirect_to root_path end end 省略 def product_params params.require(:product).permit( :name, :description, :price, :quality, :delivery_origin, :delivery_status, :delivery_cost, :prep_days, :category_id, product_images_attributes: [:id, :image_url[]] ) end

products/new.html.haml

= form_for @product do |f| .sell-product__container__form .preview-content#sell-content .preview-content__main .preview-content__main__box %label 商品画像 %span.require 必須 %p 最大3枚までアップロードできます(ドラッグ&ドロップまたはクリックしてファイルをアップロード) .preview-content__main__box__container .preview-content__main__box__dropbox %pre %ul - 3.times do %li .view_box = f.fields_for :product_images do |i| = i.file_field :image_url, class: 'file',multiple: true

model/products.rb

省略 has_many :product_images, dependent: :destroy accepts_nested_attributes_for :product_images, allow_destroy: true 省略

model/product_images.rb

class ProductImage < ApplicationRecord # Association belongs_to :product mount_uploaders :image_url, ImageUploader end

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

Ruby version 2.5.1
Rails version 5.2.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

文字列の配列なので["str"]となっているだけのように見えますが、
本当に[" "]を取り除いてもいいのですか?
例では要素が1つなのでいいのかもしれませんが、複数の場合の動作はどうなるでしょうか?
もっと別のアプローチが必要なのでは?例えば以下のような...

rb

1attribute :image_url, :string, array: true

rb

1@product = current_user.products.build(product_params) do |product| 2 product.product_images.build(*image_params) 3end 4 5def product_params 6 params.require(:product).permit(%i[name description price quality delivery_origin delivery_status delivery_cost prep_days category_id]) 7end 8 9def image_params 10 params.require(:product).permit(product_images_attributes: [:id, :image_url[]]) 11end

雰囲気で書いたんですけどこんな感じですかね...?

投稿2019/08/20 05:20

編集2019/08/21 01:05
Mugheart

総合スコア2344

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

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

rui-watanabe

2019/08/20 08:57

ご回答ありがとうございます。 ご指摘通り、モデルに対して、attrubute :image_url, :string, array: trueの記述をしました。 しかし今度はコントローラのnewアクションのところの @product.product_images.build に、unknown keyword: arrayと出て、配列型ではないというエラーが出ます。 理解不足で大変申し訳ないのですが、ここでの配列型の指定についてご教授いただけると非常に助かります。
Mugheart

2019/08/20 09:00

typo してました。 attrubute じゃなくて attribute です。
Mugheart

2019/08/20 09:03

あと書いてなかったですが、array: true を使えるのはDBがPostgreSQLの時だけだったかもしれません。
rui-watanabe

2019/08/20 09:08 編集

そうなのですね、DBはMySqlでやってます。 もし他の指定でお分かりになることがあったら、ご教授いただけると非常に助かります。
Mugheart

2019/08/20 09:10

であれば取り出すときに整形するとかですかね...。 お勧めではないですが eval('["str"]') とかやると ["str"] の配列が返ってきたりします。 どちらにせよ複数の画像選択ということであれば image_url は配列で複数あると思うので テーブルを分けて子レコードとして複数持つか、 取り出すときに整形するかのどちらかのアプローチがいいと思います。
rui-watanabe

2019/08/20 09:43

迅速なご回答誠にありがとうございます。 カラムに入れたものを整形する時は、例えばproductsのindexページで、 = image_tag("#{@product.product_images.last.eval('["image_url"]')}", class:"main__image__size")とするとまた別のエラーが出てしまいました。 https://gyazo.com/1eeedab8365e9059fe63682c72d10274 度々で申し訳ございませんが。上記のエラーの対応などをご教示いただけると非常に助かります。 指定の仕方などが間違っているのでしょうか。
Mugheart

2019/08/21 00:59

eval の使い方が誤っています。あとeval を使うのはあまりお勧めできないです。 モデルに serialize を指定する方法もあるんですが、これもお勧めできないです。 複数のレコードに分割させるのが一番いいと思います。
rui-watanabe

2019/08/23 12:15

記載通り記述したら解決しました。 ご丁寧に教えてくださりありがとうございます! 非常に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問