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

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

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

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

Ruby on Rails 6

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

Q&A

解決済

1回答

753閲覧

【Rails6】decimalのselect_boxの取り扱いについて

ssk

総合スコア332

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2022/01/03 04:57

編集2022/01/03 11:20

f.selectdecimalの型の取り扱いに困っています。
フォームから→更新→primary_achieveは1を選択→バリデーションエラー→render :edit
このときに入力された値の1を引き継ぐのことができません。

f.objectの中身を見ると、primary_achieveには0.1e1が入っています。
f.selectのvalueに0.1e1がないため、選択されていないと思われます。

どのようにすれば、値を引き継ぐことができますか?

ruby

1class CreateSales < ActiveRecord::Migration[6.1] 2 def change 3 create_table :sales do |t| 4 t.decimal :primary_achieve 5 end 6 end 7end

ruby

1= form_for(@sales, url: request_url) do |f| 2 = f.select(:primary_achieve, options_for_select(1..3), { include_blank: "選択してください。" })

ruby

1def update 2 @sale.assign_attributes(sale_params) 3 if @sale 4 else 5 render :edit 6 end 7end

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

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

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

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

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

winterboum

2022/01/03 08:17

options_for_select(1..3) これでは 0.5は扱えないのでは??
ssk

2022/01/03 08:56

言葉足らずで申し訳ございません。 他の項目でも同じように、selectを利用しておりそこで0.5を使用しております。 今回の例は1でしたので、0.5は必要ないかと思い省いていました。
winterboum

2022/01/03 11:12

下手な編集すると返ってわからなくなります。 問題が起きたときのcodeに差し替えてください
ssk

2022/01/03 11:22

編集いたしました。 0.5というのが紛らわしかったので、削除し整数にしました。その場合のdecimalの型の取り扱い方法をご教授いただけますと幸いです。
guest

回答1

0

ベストアンサー

整数値だけで良いのでしたらかんたんです
options_for_select(1..3, selected: f.object.primary_achieve.to_i)

投稿2022/01/03 11:30

winterboum

総合スコア23567

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

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

ssk

2022/01/03 12:15

ありがとうございます。 そして、二度手間になってしまい申し訳ございません。 0.5などの小数点も含めたい場合は難しいでしょうか? 中身は以下のようになっております。 = f.select(:primary_achieve, options_for_select( (0..1).step(0.5).map{|n| n%1 == 0 ? n.to_i : n} ), { include_blank: "選択してください。" })
winterboum

2022/01/03 23:22

decimal で select したことが無いので推定とかなのですが、 不思議なことがあります。decimaal の 0.1e1 == 1 なのになぜoptions_for_select が等しいと見てくれないのか。 試しに、2つ目の引数として、 f.object.to_f を入れるとどうなりますか? 1.0 を 1 にする変換をやめるのも試してください。
ssk

2022/01/04 01:37

以下の形で試したところ、0.5のみ入力内容をバリデーションエラー後に引き継ぐことができていました。 options_for_select( (0..1).step(0.5).map{|n| n%1 == 0 ? n.to_i : n}, f.object.primary_achieve.to_f)
ssk

2022/01/04 01:48

以下のように事前に整形するようにしてみました。 動作はしていますが、なんか微妙な書き方のような気がしています... もっと短く効率的に書くことは難しいでしょうか? selected = if f.object.primary_achieve.present? f.object.primary_achieve%1 == 0 ? f.object.primary_achieve.to_i : f.object.primary_achieve.to_f else nil end options_for_select( (0..1).step(0.5).map{|n| n%1 == 0 ? n.to_i : n}, selected)
winterboum

2022/01/04 03:03

Saleに primary_achieve を このように整形するmethodを作り、何を求めているのか(HowでなくWhatで)わかる名前をつけ、 options_for_select( (0..1).step(0.5).map{|n| n%1 == 0 ? n.to_i : n}, f.object.メソッド) ですね。
ssk

2022/01/04 03:22

ありがとうございます。 メソッドに切り出して、スッキリ書くことができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問