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

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

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

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

Q&A

解決済

1回答

972閲覧

データベースの値を更新して保存したいです。(Rails)

nn-901

総合スコア11

Ruby on Rails 5

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

0グッド

0クリップ

投稿2021/12/22 08:41

Railsのインプットの学習が終わったので、アウトプットの練習に、
簡単なwebアプリを作成しています。

Vegetableテーブルに、string型で、countカラムに、野菜の個数を数字で保存しており、
editアクションで、その数字からいくつ取り出すか、を入力してもらい、
updateアクションで、入力値をparamsで受け取り、@edit_countに代入。入力値の値によってif
文で条件分岐して、

①@edit_count > @vegetable.countの時はeditアクションに戻す。
②@edit_count と @vegetable.countが同じ時はデータを消去する。
③それ以外の時(0 < @edit_count < @vegetable.count)の時は、@vegetable.countから@edit_countの値を引いて、データを更新して保存したいのですが、

③の部分を試してみると、”-”メソッドが見つからない、という内容のエラーが出てしまいます。

Ruby

1<div class="edit_wrapper"> 2 <h1 class="edit_title">ぬか床から取り出す</h1> 3 <p>【選択中のお野菜】</p> 4 <div class="select_date"> 5 <a><%= @vegetable.month %>月</a> 6 <a><%= @vegetable.day %>日</a> 7 <a><%= @vegetable.time %>時</a> 8 <a>に漬けた</a> 9 </div> 10 <div class="select_content"> 11 <a class="select_content_name"><%= @vegetable.name %></a> 12 <a class="select_content_count"><%= @vegetable.count %>個</a> 13 </div> 14 <div class="count_form"> 15 <p>【取り出す個数を入力してください】</p> 16 <div class="edit_error_message"> 17 <%= @edit_error_message %> 18 </div> 19 <%= form_tag("/vegetables/#{@vegetable.id}/update")do %> 20 <input type="number" class="edit_count" name="edit_count" min="1" max="99"><a></a> 21 <p class="edit_caution">一度ぬか床から取り出したら戻せません。</p> 22 <p class="edit_caution">本当にお野菜を取り出しますか?</p> 23 <input class="update_btn" type="submit" value="OK!"> 24 <%= link_to("やめる", "/users/#{@vegetable.user_id}/mypage", {:class => "cancel_btn"}) %> 25 <% end %> 26 </div> 27</div>

Ruby

1def update 2 @vegetable = Vegetable.find_by(id: params[:id]) 3 @edit_count = params[:edit_count] 4 if @edit_count > @vegetable.count 5 @edit_error_message = "正しい数値を入力してください" 6 render("vegetables/edit") 7 elsif @edit_count == @vegetable.count 8 @vegetable.destroy 9 redirect_to("/users/#{@current_user.id}/mypage") 10 else 11 @vegetable.count = @vegetable.count - @edit_count 12 @vegetable.save 13 redirect_to("/users/#{@current_user.id}/mypage") 14 end 15 end

Ruby

1NoMethodError in VegetablesController#update 2undefined method `-' for "3":String Did you mean? -@ 3Extracted source (around line #37): 435 536 637 738 839 940 10 11 redirect_to("/users/#{@current_user.id}/mypage") 12 else 13 @vegetable.count = @vegetable.count - @edit_count 14 @vegetable.save 15 redirect_to("/users/#{@current_user.id}/mypage") 16 end 17 18

試してみたこと↓

paramsで受け取っているため、文字列だから引き算ができないのかと思い、.to_iメソッドを使ってみましたが、うまくいかず。

独学の部分も多いので、常識はずれのコードがあるかもしれません。
見辛かったら申し訳ないです・・・。

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

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

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

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

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

hoshi-takanori

2021/12/22 16:09

Vegetable テーブルの count カラムが string 型ってことでしょうか?
nn-901

2021/12/22 16:19

はい、そうです!
FKM

2021/12/23 01:12

to_iメソッドを使った計算式の書き方はどうやりましたか?
nn-901

2021/12/23 04:05

def update @vegetable = Vegetable.find_by(id: params[:id]) @edit_count = params[:edit_count].to_i @vegetable.count = @vegetable.count.to_i if @edit_count > @vegetable.count @edit_error_message = "正しい数値を入力してください" render("vegetables/edit") elsif @edit_count == @vegetable.count @vegetable.destroy redirect_to("/users/#{@current_user.id}/mypage") else @vegetable.count = @vegetable.count - @edit_count @vegetable.save redirect_to("/users/#{@current_user.id}/mypage") end end 上から3、4行目が修正したコードです。 これでもエラーがでてしまいました。正しい書き方があったら教えていただきたいです・・・!
FKM

2021/12/23 04:21

params[:edit_count]はtype=numberで取得しているので、ここはto_iに変える必要ないような気もします。
nn-901

2021/12/23 04:43

そうなんですね! paramsを使って取得した時点で全て文字列になってしまうんだと思っていました・・・。 @vegetable.countも、ユーザーから入力してもらうときに、input type =numberで取得してデータベースに保存しているので、 この場合は@vegetable.countも @edit_countも、どちらも数値なのでしょうか・・・?
FKM

2021/12/23 04:51

array.countはオブジェクト、配列の個数を数えるためのメソッドなので数値を返します。 そもそもedit_countとbagetable.countにちゃんと数値が入っているかlogger.debugで確認してみては?
nn-901

2021/12/23 05:11

承知しました、ありがとうございます! 恥ずかしながらlogger.debugというものの使い方を知らないので調べて使ってみます!
guest

回答1

0

自己解決

色々試していたら自己解決しました。
hoshi-takanoriさん、FKMさん、アドバイスありがとうございました!

修正後のコードを以下に添付します。

def update @vegetable = Vegetable.find_by(id: params[:id]) @edit_count = params[:edit_count].to_i if @edit_count > @vegetable.count.to_i @edit_error_message = "正しい数値を入力してください" render("vegetables/edit") elsif @edit_count == @vegetable.count.to_i @vegetable.destroy flash[:notice] = "ぬか床から取り出しました" redirect_to("/users/#{@current_user.id}/mypage") else @vegetable.count = @vegetable.count.to_i - @edit_count @vegetable.save flash[:notice] ="ぬか床から取り出しました" redirect_to("/users/#{@current_user.id}/mypage") end end

エラーコードの中に、”文字列と数値の比較でエラー”というような記載があったため、.to_iメソッドの使い方を変えてみたところ、このコードで意図する動きをしました。

if文の中で、一度.to_iメソッドを使用していれば、それ以下は使用しなくてもいいのかと思いましたが、そうではなかったようです・・・。

まだ理解度が低いので、paramsの特性など調べて学んでいこうと思います!
助かりました、ありがとうございました!

投稿2021/12/24 04:14

nn-901

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問