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

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

ただいまの
回答率

89.07%

カラムにinteger型として保存されない。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 384

SomaSekimoto

score 9

前提・実現したいこと

テーブルのカラムにinteger型として、保存したい。

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

某フリマアプリの模倣アプリを作成中、enumを使用してselectタグを作成。
itemsテーブルのshipping_daysカラムにinteger型として保存させたいが、何を選択しても0しか保存されない。

binding.pryをしてみると、

=> <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"7YSZtU/tfjfgeOs9Uz2f1xPp74dyKPFS6w8rWkchWNbhLwaUBxGtrZOOMfyKwJea0LWYzH9Gzq4h121daXnmbA==", 
"item"=>{"images_attributes"=>{"0"=>{"content"=>#<ActionDispatch::Http::UploadedFile:0x00007ff7f5a78f88 @tempfile=#<Tempfile:/var/folders/mk/8f7vv9q95xdf64s6pz1dk_vr0000gn/T/RackMultipart20200316-66277-f8p6kq.jpeg>, @original_filename="ダウンロード (1).jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"item[images_attributes][0][content]\"; filename=\"\xE3\x82\xBF\xE3\x82\x99\xE3\x82\xA6\xE3\x83\xB3\xE3\x83\xAD\xE3\x83\xBC\xE3\x83\x88\xE3\x82\x99 (1).jpeg\"\r\nContent-Type: image/jpeg\r\n">},
 "1"=>{"content"=>#<ActionDispatch::Http::UploadedFile:0x00007ff7f5a6ba90 @tempfile=#<Tempfile:/var/folders/mk/8f7vv9q95xdf64s6pz1dk_vr0000gn/T/RackMultipart20200316-66277-1ggsvek.jpeg>, @original_filename="ダウンロード (2).jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"item[images_attributes][1][content]\"; filename=\"\xE3\x82\xBF\xE3\x82\x99\xE3\x82\xA6\xE3\x83\xB3\xE3\x83\xAD\xE3\x83\xBC\xE3\x83\x88\xE3\x82\x99 (2).jpeg\"\r\nContent-Type: image/jpeg\r\n">}}, 
"name"=>"あああああ", "description"=>"あああああ", "parent_name"=>"メンズ", "brand_id"=>"3", 
"condition"=>"傷や汚れあり", "fee"=>"着払い(購入者が負担)", 
"shipping_days"=>"4〜7日後に発送", "area"=>"茨城県", "price"=>"4000"}, 
"category_id"=>"100", "commit"=>"出品する", "controller"=>"items", "action"=>"create"} 
permitted: false>

feeカラムやconditionカラムは、この後ちゃんとinteger型に変換されている。

該当のソースコード

item.rb

class Item < ApplicationRecord 

  enum condition: {
    '新品、未使用':1, '未使用に近い':2, '目立った傷や汚れなし':3, 'やや傷や汚れあり':4, '傷や汚れあり':5, '全体的に状態が悪い':6 
  }
  enum fee: {
    '送料込み(出品者が負担)':1, '着払い(購入者が負担)':2
  }


  enum shipping_day: {
    '1〜2日後に発送':1,  '2〜3日後に発送':2,  '4〜7日後に発送':3
  }

  enum prefecture: {
    北海道:1, 青森県:2, 秋田県:3, 岩手県:4, 山形県:5, 宮城県:6, 福島県:7, 栃木県:8, 茨城県:9, 群馬県:10, 
    埼玉県:11, 東京都:12, 千葉県:13, 神奈川県:14, 新潟県:15, 長野県:16, 岐阜県:17, 石川県:18, 福井県:19, 富山県:20, 
    山梨県:21, 静岡県:22, 愛知県:23, 三重県:24, 滋賀県:25, 和歌山県:26, 奈良県:27, 京都府:28, 大阪府:29, 兵庫県:30, 
    岡山県:31, 鳥取県:32, 島根県:33, 広島県:34, 山口県:35, 香川県:36, 徳島県:37, 愛媛県:38, 高知県:39, 福岡県:40, 
    佐賀県:41, 長崎県:42, 大分県:43, 熊本県:44, 宮崎県:45, 鹿児島県:46, 沖縄県:47
  }

  belongs_to :brand, optional: true
  belongs_to :user, optional: true
  belongs_to :category,  optional: true
  has_many :images, dependent: :destroy
  accepts_nested_attributes_for :images, allow_destroy: true
end

new.html.haml

.main-items
    = form_with model: @item, local: true do |f|
      .wrapper.image-wrapper
        #image-box.image-wrapper__image-box
          = f.fields_for :images do |i|
            .image-wrapper__image-box__js.js-file_group{data:{index: "#{i.index}"}}
              = i.label :content, class: "image-wrapper__image-box__js__label" do
                .image-wrapper__image-box__js__label__image.img_field{id: "img_field--#{i.index}", onClick: "$('#file').click()"}
                  - if @item.images[i.index][:content].present?
                    = image_tag(f.image.content)
                  - else
                    = image_tag 'icon_camera.png', class: "image-wrapper__image-box__js__label__image__url" 
                = i.file_field :content, class: "image-wrapper__image-box__js__label__file js-file", id: "item_images_attributes_#{i.index}_content", required: "required"
              .js-remove
                %span.js-remove__text
                  削除


      .wrapper.name-wrapper
        %label.wrapper__label
          商品名:
          %span.required
            ※必須
          = f.text_field :name, placeholder: "40字まで", class: "name-wrapper__name form-control", required: "required"
      .wrapper.description-wrapper
        %label.wrapper__label
          商品説明:
          %span.required
            ※必須
          = f.text_area :description, placaeholder: "色・素材・重さ・定価・注意点などを書きましょう(1000文字まで)", class: "name-wrapper__description form-control", required: "required", size: "40 x 10"
      .form-separator

      .wrapper.category-wrapper
        = f.label :category_id , class: 'wrapper__label category-wrapper-label', id: "wrapper__label--category" do
          カテゴリー:
          %span.required ※必須
          .category-wrapper-box
            .category-wrapper-select
              .category-wrapper-select__box
                = f.select :parent_name, @category_parent_array, {}, {class: 'category-wrapper__category form-control', id: 'parent_category'}


      .wrapper.brand-wrapper
        %label.wrapper__label
          ブランド:
          = f.select :brand_id, options_for_select(@brands.map{|b| [b.name, b.id, {}]}), {prompt: "指定なし"}, class: "brand-wrapper__brand form-control"

      .wrapper.condition-wrapper
        %label.wrapper__label
          商品の状態:
          %span.required
            ※必須
          = f.select :condition, Item.conditions.keys, {prompt: "指定なし", selected: 1}, {class: "condition-wrapper__condition form-control", required: "required"}
      .form-separator

      .wrapper.fee-wrapper
        %label.wrapper__label
          配送料の負担:
          %span.required
            ※必須
          = f.select :fee, Item.fees.keys, { prompt: "", selected: 1}, class: "fee-wrapper__fee form-control", required: "required"

      .wrapper.shipping_days-wrapper
        %label.wrapper__label
          発送日の目安:
          %span.required
            ※必須
          = f.select :shipping_days, Item.shipping_days.keys, {prompt: "", selected: 1}, class: "shipping_days-wrapper__shipping-days form-control", required: "required"
      .wrapper.area-wrapper
        %label.wrapper__label
          発送元の地域:
          %span.required
            ※必須
          = f.select :area, Item.prefectures.keys, {prompt: 1, selected: 1}, class: "area-wrapper__area form-control", required: "required"
      .form-separator

      .wrapper.price-wrapper
        %label.wrapper__label
          価格:
          %span.required
            ※必須
          = f.number_field :price, class: "price-wrapper__price form-control", required: "required"

      .wrapper.submit-wrapper
        = f.submit "出品する", class: "btn submit-wrapper__submit-btn"

schema.rb

create_table "items", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.string "name", null: false
    t.text "description", null: false
    t.integer "price", null: false
    t.integer "condition", null:false
    t.integer "fee", null: false
    t.string "area", null: false
    t.integer "shipping_days", null: false
    t.string "customer_id"
    t.bigint "user_id"
    t.bigint "brand_id"
    t.bigint "category_id", null: false
    t.index ["brand_id"], name: "index_items_on_brand_id"
    t.index ["category_id"], name: "index_items_on_category_id"
    t.index ["user_id"], name: "index_items_on_user_id"
  end

items_controller.rb

def new
    @item = Item.new
    @brands = Brand.all

    @category_parent_array = ["指定なし"]
    Category.where(ancestry: nil).each do |parent|
      @category_parent_array << parent.name
    end

    @item.images.build
  end

def create
    binding.pry
    @item = Item.new(item_params)

    if @item.save!
      @image = @item.images.create
      redirect_to :root
    else
      render :new
    end

  end

private
  def item_params
    params.require(:item).permit(
      :name, :description, :price, :brand_id, :area, :condition, :fee,
      :shipping_days, images_attributes: [:content, :id, :_destroy]
      ).merge(user_id: current_user.id, category_id: params[:category_id], brand_id: params[:item][:brand_id])
  end

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

Ruby 2.5.1p57
Ruby on rails 5.2.3
haml-rails 2.0.1
CarrierWave 2.1.0

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

-  enum shipping_day: {
+  enum shipping_days: {

ではないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/16 21:14

    そうでした!
    ここのshipping_daysをカラム名と同じにしなければならないことを知りませんでした。
    ご指摘ありがとうございます!

    キャンセル

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

  • ただいまの回答率 89.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る