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

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

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

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

Ruby on Rails

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

Q&A

1回答

569閲覧

Ruby on Rails で計算アプリがうまく作れません。

Kay_Hatsune

総合スコア4

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/03/29 14:32

前提・実現したいこと

Ruby on Railsのform_forで数字を入力し複利積立の計算式を通して計算して、結果を表示したいと思い、modelにその数式を作り、viewで呼び起こそうとしたところ、演算子がundefined methodとなってしまいます。
そもそもこういう場合はmodelに数式を作っていいものなのでしょうか。

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

undefined method `*' for nil:NilClass

イメージ説明

該当のソースコード

modelのコードです↓

ruby

1class Compound < ApplicationRecord 2 validates :yield, numericality: true 3 validates :reserve, numericality: { only_integer: true } 4 validates :years, numericality: { only_integer: true } 5 6 def compound_interest 7 (reserve * 12) * (((( 1 + (yield / 100)) ** years) - 1) / (yield / 100)) 8 end 9end

new.html.erbというファイルのコードです。↓

ruby

1<div class="asset-management"> 2 <div class="asset-container"> 3 <%= form_for @compound do |f| %> 4 <div class="yeild"> 5 <p>年間利回り</p> 6 <%= f.number_field :yield, class: 'form-control' %>% 7 </div> 8 <div class="reserve"> 9 <p>毎月積立金額</p> 10 <%= f.number_field :reserve, class: 'form-control' %>円 11 </div> 12 <div class="years"> 13 <p>積立年数</p> 14 <%= f.number_field :years, class: 'form-control' %>年 15 </div> 16 <div class="calculate"> 17 <p><span><%= f.submit "計算する" %></span></p> 18 </div> 19 <% end %> 20 </div> 21</div>

create.html.erbというファイルのコードです。↓

ruby

1<div class="asset-management"> 2 <div class="asset-container"> 3 <p><%= @compound.compound_interest %>円</p> 4 </div> 5</div> 6

routes.rbのコードです。↓

ruby

1Rails.application.routes.draw do 2 post "compounds" => "compounds#create" 3 get "compounds" => "compounds#new" 4end

compounds_controller.rbというファイルのコードです。↓

ruby

1class CompoundsController < ApplicationController 2 def new 3 @compound = Compound.new 4 end 5 6 def create 7 @compound = Compound.new 8 end 9end

20200328114916_create_compounds.rbというファイルのコードです。↓

ruby

1class CreateCompounds < ActiveRecord::Migration[6.0] 2 def change 3 create_table :compounds do |t| 4 t.integer :yield 5 t.integer :reserve 6 t.integer :years 7 8 t.timestamps 9 end 10 end 11end

試したこと

controllerに数式を書いてみましたがダメでした。

あと、contorollerを↓のように書いたりもしましたがダメでした。

def create @compound = Compound.create( yield: params[:yield], reserve: params[:reserve], years: params[:years] ) end end

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

ruby 2.6.3

Rails 6.0.2.2

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

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

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

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

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

winterboum

2020/03/30 01:57

気になりますね。 ただ、RDB関連の予約語ではないから、orderにつかう項目にorderを使うよりはましかな。。
guest

回答1

0

modelを作ってそいつに計算させるという方針はOKです
というか、object指向ではそのようなやりかたが良い方法です。

問題はCompound.newした時も、その後compound_interestを呼び出す前までも、reserve,year,yeildいずれにも値を入れていないことです。
計算条件はどこで手に入りますか?
そのデータでnewしましょう。

投稿2020/03/29 20:58

winterboum

総合スコア23416

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

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

Kay_Hatsune

2020/03/30 01:11

回答ありがとうございます! submitを押したら、number_fieldに入れた数字が計算条件となってmodelに入ると思っていましたが、例えば、controllerに計算条件を記述するものなのでしょうか?それともviewにまた別に計算条件を定義するようなファイルを作った方がいいのでしょうか?
winterboum

2020/03/30 01:57

submitを押したときにサーバーに渡ってくるparamsをつかってnewにデータを渡さなければなりません。 その辺りは入門書にあるかと思いますので探してください どんなパラメータがどんな形で渡ってくるかは、logを見るとわかります
Kay_Hatsune

2020/03/30 11:17

ありがとうございます。試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問