【Ruby on Rails開発奮闘記】シンプルな家計簿アプリを作る(2)
こんにちは、koheiです。
前回の記事で、家計簿の科目設定を追加したので、今回は、実際に科目の金額を登録する機能を追加してみたいと思います。
- シンプルな家計簿アプリを作る(1) 「科目設定機能を作る」
- シンプルな家計簿アプリを作る(2) 「収支登録機能を作る」←今回の内容
- シンプルな家計簿アプリを作る(3) 「収支確認機能(グラフなど)を作る」
目次
1.仕様(今回追加する部分)
図で示すと今回作成する部分は以下になります。
科目金額の登録は、1カラムずつ登録していくとすごく面倒なので、月ごとに一括で登録するように対応します。
登録する年月を設定し、科目設定で登録した科目毎に金額を月単位で一括登録できるようにします。(以下)
今回作成する部分のMVCモデルは以下のようになります。各科目金額用にモデル、コントローラー、ビューを追加します。各科目の金額用モデルは、それぞれの科目と関連付けします。また、一括登録用にformをモデルに追加しています。
2.収入科目データ登録追加
まずは、収入科目データ登録から作っていきたいと思います。
2-1.モデルの追加
まずは、収入科目金額用のモデルを追加します。
収入科目金額テーブルのカラムを追加します。
・income_id:収入科目テーブルのID(外部キー)※収入科目テーブルと紐付けるため。
・year_month:年月
・value:金額(値)
・description:備考
1 2 3 4 5 6 7 8 9 10 11 |
class CreateIncomeValues < ActiveRecord::Migration[5.2] def change create_table :income_values do |t| t.integer :income_id, null: false t.date :year_month t.integer :value t.string :description t.timestamps end end end |
収入科目テーブルと関連付けをします。収入科目テーブル(income.rb)にhas_manyメソッドを追加して、income_valuesを指定します。dependentオプションに:destroyを指定すると、収入科目テーブルのレコードが削除されたときに、収入金額用のレコードも削除されるようになります。
1 2 3 |
class Income < ApplicationRecord has_many :income_values, dependent: :destroy end |
次に、以下コマンドを入力し、マイグレーションを実行します。これで、income_valuesテーブルが作成されます。
2-2.コントローラーの追加
次に、収入科目金額テーブルをコントロールするコントローラーを作成します。
routes.rbにリソースを追加します。
1 2 3 4 5 6 7 8 |
Rails.application.routes.draw do root "top#index" resources :incomes resources :fixedcosts resources :variablecosts resources :income_values end |
各アクションを以下のように実装します。
※今回showアクションとテンプレートは使いませんが、とりあえず暫定で追加してます。
今回、一括登録を対応するため、newメソッドやcreateメソッド等では、次節で紹介するIncomeFormクラスをnewしています。
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 48 49 50 51 52 53 54 55 56 |
class IncomeValuesController < ApplicationController def index @incomes = Income.order(created_at: :asc) @income_values = IncomeValue.order("year_month asc") end def show @income_value = IncomeValue.find(params[:id]) end def new year_month_day = params[:year_month] + "-01" @year_month = year_month_day.to_date @incomes = Income.order(created_at: :asc) @form = Form::IncomeForm.new end def edit @income_value = IncomeValue.find(params[:id]) @income = Income.find(@income_value.income_id) end def create @form = Form::IncomeForm.new(income_form_params) if @form.save redirect_to :income_values, notice: "登録しました" else redirect_to :income_values, notice: "登録に失敗しました" end end def income_form_params params .require(:form_income_form) .permit(income_values_attributes: Form::IncomeValue::REGISTRABLE_ATTRIBUTES) end def update @income_value = IncomeValue.find(params[:id]) @income_value.assign_attributes(params[:income_value]) if @income_value.save redirect_to :income_values, notice: "情報を更新しました" else render "edit" end end def destroy @income_value = IncomeValue.find(params[:id]) @income_value.destroy redirect_to :income_values, notice: "データを削除しました。" end end |
2-3.一括登録フォームの対応
今回金額登録時は、一括登録フォームで対応するので、modelsフォルダ内に、以下の3つのファイルを追加します。
・app/models/form/base.rb
・app/models/form/income_values.rb
・app/models/form/income_form.rb
一括登録の対応は以下の記事を参考にさせてもらいました。ありがとうございます。
一括登録フォームの実装
新規登録時、一括フォーム用のクラスIncomeFormを使って、一括登録用のパラメータを構築していきます。
正直、一括フォームの対応は初心者の私には難しく、上記のサイトを参考にかなり試行錯誤を繰り返してようやく動いた実装なので色々と無駄な処理などもあるかもしれません。色々理解したことは随時更新していきます。
1 2 3 4 5 6 7 |
# app/models/form/base.rb class Form::Base include ActiveModel::Model include ActiveModel::Callbacks include ActiveModel::Validations include ActiveModel::Validations::Callbacks end |
1 2 3 4 5 6 7 |
class Form::IncomeValue < IncomeValue REGISTRABLE_ATTRIBUTES = %i(income_id year_month value description) attr_accessor :income_id attr_accessor :year_month attr_accessor :value attr_accessor :description end |
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 |
class Form::IncomeForm < Form::Base attr_accessor :income_values def initialize(attributes = {}) super attributes incomes = Income.order(created_at: :asc) self.income_values = incomes.map { |income| IncomeValue.new(income_id: income.id) } unless income_values.present? end def income_values_attributes=(attributes) self.income_values = attributes.map do |_, income_value_attributes| Form::IncomeValue.new(income_value_attributes).tap { |v| puts v} end end def valid? valid_income_values = self.income_values.map(&:valid?).all? super && valid_income_values end def save return false unless valid? IncomeValue.transaction { self.income_values.select.each { |income_value| a1 = IncomeValue.new(:income_id => income_value.income_id, :year_month => income_value.year_month, :value => income_value.value, :description => income_value.description) a1.save! } } true end def target_income_values self.income_values.select { |v| '*' } end end |
2-4.ビューの追加
最後に表示部分(ビュー)を作成していきます。
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 |
<% require 'active_support/core_ext/numeric/conversions' %> <h2>収入科目の新規データ登録</h2> <p>登録年月を設定してください</p> <%= form_tag({controller: :income_values, action: :new}, {method: :post}) do %> <input type="month" name="year_month"> <input type="submit"> <% end %> <h2>収入科目 データ一覧 </h2> <% if @income_values.present? %> <table> <tr> <th>登録年月</th> <th>名称</th> <th>値</th> <th>備考</th> <th>操作</th> </tr> <% @income_values.each do |income_value| %> <tr> <td><%= income_value.year_month.strftime('%Y年%m月') %></td> <td><%= @incomes.find(income_value.income_id).name %></td> <td><%= income_value.value.to_s(:delimited) %> 円</td> <td><%= income_value.description %></td> <td> <%= link_to "編集", [:edit, income_value] %> | <%= link_to "削除", income_value, method: :delete, data: { confirm: "本当に削除しますか?"} %> </td> </tr> <% end %> </table> <% else %> <p>登録されているデータがありません。</p> <% end %> |
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 |
<% @page_title = "収入科目 データ登録" %> <h2><%= @page_title %></h2> <div class="toolbar"><%= link_to "収入科目データ一覧に戻る", :income_values %></div> <%= form_for(@form, url: income_values_path, method: :post) do |fb| %> <!-- 年月テーブル --> <table> <tr> <th>登録年月</th> <th>名称</th> <th>値</th> <th>備考</th> </tr> <% cnt=0 %> <%= fb.fields_for :income_values do |f| %> <%= f.hidden_field :income_id %> <tr> <td> <%= f.date_select :year_month, start_year: 2010, end_year: Time.current.year, use_month_numbers: true, discard_day: true, default: @year_month %> </td> <th> <%= @incomes.find(@form.income_values[cnt].income_id).name %> </th> <% cnt+=1 %> <td><%= f.text_field :value, size: 8 %></td> <td><%= f.text_field :description, size: 8 %></td> </tr> <% end %> </table> <div><%= fb.submit %></div> <% end %> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<h2>収支科目 データ修正 </h2> <%= form_for @income_value do |form| %> <table> <tr> <th>登録日</th> <th>名称</th> <th>値</th> <th>備考</th> </tr> <tr> <td><%= form.date_select :year_month, start_year: 2010, end_year: Time.current.year, use_month_numbers: true, discard_day: true %></td> <th><%= @income.name %></th> <td><%= form.text_field :value %></td> <td><%= form.text_field :description %></td> </tr> </table> <div><%= form.submit %></div> <% end %> |
showは、今回は使わないですが、とりあえず追加しておきます。
1 |
<h1>show</h1> |
トップページから、収入金額登録画面へ遷移するためのリンクを追加します。
まず、routes.rbにパスを追加します。
1 2 3 4 5 6 7 8 9 |
Rails.application.routes.draw do root "top#index" post "income_values/new(/:name)" => "income_values#new" resources :incomes resources :fixedcosts resources :variablecosts resources :income_values end |
次に、トップページのビューに収入金額登録へのリンクを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<h1>Simple Kakeibo</h1> <p>シンプルな家計簿アプリです。</p> <h2>科目設定</h2> <ul> <li><%= link_to "収入科目設定", :incomes %></li> </ul> <ul> <li><%= link_to "固定費科目設定", :fixedcosts %></li> </ul> <ul> <li><%= link_to "変動費科目設定", :variablecosts %></li> </ul> <h2>収支登録</h2> <ul> <li><%= link_to "収入金額登録", :income_values %></li> </ul> |
ここまで作ったら、一旦サイトを確認してみます。
bin/rails sコマンドでサーバーを起動し、ブラウザでhttp://localhost:3000/にアクセスしてみてください。
以下のようにトップページから、収入金額登録をクリックし、登録年月を設定し収入科目のデータ登録ができればOKです。
3.固定費科目データ登録追加
次に固定費科目のデータ登録を追加します。クラス名等は違いますが、実装方法は先程の収入科目データ登録と同じなのでコードだけ載せておきます。
モデルの追加
カラムの追加
1 2 3 4 5 6 7 8 9 10 11 |
class CreateFixedcostValues < ActiveRecord::Migration[5.2] def change create_table :fixedcost_values do |t| t.integer :fixedcost_id, null: false t.date :year_month t.integer :value t.string :description t.timestamps end end end |
テーブルの関連付け
1 2 3 |
class Fixedcost < ApplicationRecord has_many :fixedcost_values, dependent: :destroy end |
マイグレーションの実行
コントローラーの作成
リソースの追加
1 2 3 4 5 6 7 8 9 10 |
Rails.application.routes.draw do root "top#index" post "income_values/new(/:name)" => "income_values#new" resources :incomes resources :fixedcosts resources :variablecosts resources :income_values resources :fixedcost_values end |
アクションの実装
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 48 49 50 51 52 53 54 |
class FixedcostValuesController < ApplicationController def index @fixedcosts = Fixedcost.order(created_at: :asc) @fixedcost_values = FixedcostValue.order("year_month asc") end def show @fixedcost_value = FixedcostValue.find(params[:id]) end def new year_month_day = params[:year_month] + "-01" @year_month = year_month_day.to_date @fixedcosts = Fixedcost.order(created_at: :asc) @form = Form::FixedcostForm.new end def edit @fixedcost_value = FixedcostValue.find(params[:id]) @fixedcost = Fixedcost.find(@fixedcost_value.fixedcost_id) end def create @form = Form::FixedcostForm.new(fixedcost_form_params) if @form.save redirect_to :fixedcost_values, notice: "登録しました" else redirect_to :fixedcost_values, notice: "登録に失敗しました" end end def fixedcost_form_params params .require(:form_fixedcost_form) .permit(fixedcost_values_attributes: Form::FixedcostValue::REGISTRABLE_ATTRIBUTES) end def update @fixedcost_value = FixedcostValue.find(params[:id]) @fixedcost_value.assign_attributes(params[:fixedcost_value]) if @fixedcost_value.save redirect_to :fixedcost_values, notice: "情報を更新しました" else render "edit" end end def destroy @fixedcost_value = FixedcostValue.find(params[:id]) @fixedcost_value.destroy redirect_to :fixedcost_values, notice: "データを削除しました。" end end |
一括フォームの対応
1 2 3 4 5 6 7 |
class Form::FixedcostValue < FixedcostValue REGISTRABLE_ATTRIBUTES = %i(fixedcost_id year_month value description) attr_accessor :fixedcost_id attr_accessor :year_month attr_accessor :value attr_accessor :description end |
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 |
class Form::FixedcostForm < Form::Base attr_accessor :fixedcost_values def initialize(attributes = {}) super attributes fixedcosts = Fixedcost.order(created_at: :asc) self.fixedcost_values = fixedcosts.map { |fixedcost| FixedcostValue.new(fixedcost_id: fixedcost.id) } unless fixedcost_values.present? end def fixedcost_values_attributes=(attributes) self.fixedcost_values = attributes.map do |_, fixedcost_value_attributes| Form::FixedcostValue.new(fixedcost_value_attributes).tap { |v| puts v} end end def valid? valid_fixedcost_values = self.fixedcost_values.map(&:valid?).all? super && valid_fixedcost_values end def save return false unless valid? FixedcostValue.transaction { self.fixedcost_values.select.each { |fixedcost_value| a1 = FixedcostValue.new(:fixedcost_id => fixedcost_value.fixedcost_id, :year_month => fixedcost_value.year_month, :value => fixedcost_value.value, :description => fixedcost_value.description) a1.save! } } true end def target_fixedcost_values self.fixedcost_values.select { |v| '*' } end end |
ビューの追加
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 |
<% require 'active_support/core_ext/numeric/conversions' %> <h2>固定費科目のデータ登録</h2> <p>登録年月を設定してください</p> <%= form_tag({controller: :fixedcost_values, action: :new}, {method: :post}) do %> <input type="month" name="year_month"> <input type="submit"> <% end %> <h2>固定費科目 データ一覧 </h2> <% if @fixedcost_values.present? %> <table> <tr> <th>登録年月</th> <th>名称</th> <th>値</th> <th>備考</th> <th>操作</th> </tr> <% @fixedcost_values.each do |fixedcost_value| %> <tr> <td><%= fixedcost_value.year_month.strftime('%Y年%m月') %></td> <td><%= @fixedcosts.find(fixedcost_value.fixedcost_id).name %></td> <td><%= fixedcost_value.value.to_s(:delimited) %> 円</td> <td><%= fixedcost_value.description %></td> <td> <%= link_to "編集", [:edit, fixedcost_value] %> | <%= link_to "削除", fixedcost_value, method: :delete, data: { confirm: "本当に削除しますか?"} %> </td> </tr> <% end %> </table> <% else %> <p>登録されているデータがありません。</p> <% end %> |
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 |
<% @page_title = "固定費科目 データ登録" %> <h2><%= @page_title %></h2> <div class="toolbar"><%= link_to "固定費科目データ一覧に戻る", :fixedcost_values %></div> <%= form_for(@form, url: fixedcost_values_path, method: :post) do |fb| %> <!-- 年月テーブル --> <table> <tr> <th>登録年月</th> <th>名称</th> <th>値</th> <th>備考</th> </tr> <% cnt=0 %> <%= fb.fields_for :fixedcost_values do |f| %> <%= f.hidden_field :fixedcost_id %> <tr> <td> <%= f.date_select :year_month, start_year: 2010, end_year: Time.current.year, use_month_numbers: true, discard_day: true, default: @year_month %> </td> <th> <%= @fixedcosts.find(@form.fixedcost_values[cnt].fixedcost_id).name %> </th> <td><%= f.text_field :value, size: 8 %>円</td> <td><%= f.text_field :description, size: 8 %></td> <% cnt+=1 %> </tr> <% end %> </table> <div><%= fb.submit %></div> <% end %> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<h2>固定費科目 データ修正 </h2> <%= form_for @fixedcost_value do |form| %> <table> <tr> <th>登録日</th> <th>名称</th> <th>値</th> <th>備考</th> </tr> <tr> <td><%= form.date_select :year_month, start_year: 2010, end_year: Time.current.year, use_month_numbers: true, discard_day: true %></td> <th><%= @fixedcost.name %></th> <td><%= form.text_field :value %></td> <td><%= form.text_field :description %></td> </tr> </table> <div><%= form.submit %></div> <% end %> |
1 |
<h1>show</h1> |
トップページから固定費金額登録画面への遷移追加
1 2 3 4 5 6 7 8 9 10 11 |
Rails.application.routes.draw do root "top#index" post "income_values/new(/:name)" => "income_values#new" post "fixedcost_values/new(/:name)" => "fixedcost_values#new" resources :incomes resources :fixedcosts resources :variablecosts resources :income_values resources :fixedcost_values end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<h1>Simple Kakeibo</h1> <p>シンプルな家計簿アプリです。</p> <h2>科目設定</h2> <ul> <li><%= link_to "収入科目設定", :incomes %></li> </ul> <ul> <li><%= link_to "固定費科目設定", :fixedcosts %></li> </ul> <ul> <li><%= link_to "変動費科目設定", :variablecosts %></li> </ul> <h2>収支登録</h2> <ul> <li><%= link_to "収入金額登録", :income_values %></li> </ul> <ul> <li><%= link_to "固定費金額登録", :fixedcost_values %></li> </ul> |
4.変動費科目データ登録追加
最後に変動費科目のデータ登録を追加します。こちらもクラス名等は違いますが、実装方法は先程の収入科目データ登録と同じなのでコードだけ載せておきます。
モデルの追加
カラムの追加
1 2 3 4 5 6 7 8 9 10 11 |
class CreateVariablecostValues < ActiveRecord::Migration[5.2] def change create_table :variablecost_values do |t| t.integer :variablecost_id, null: false t.date :year_month t.integer :value t.string :description t.timestamps end end end |
テーブルの関連付け
1 2 3 |
class Variablecost < ApplicationRecord has_many :variablecost_values, dependent: :destroy end |
マイグレーションの実行
コントローラーの作成
リソースの追加
1 2 3 4 5 6 7 8 9 10 11 12 |
Rails.application.routes.draw do root "top#index" post "income_values/new(/:name)" => "income_values#new" post "fixedcost_values/new(/:name)" => "fixedcost_values#new" resources :incomes resources :fixedcosts resources :variablecosts resources :income_values resources :fixedcost_values resources :variablecost_values end |
アクションの実装
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 48 49 50 51 52 53 54 |
class VariablecostValuesController < ApplicationController def index @variablecosts = Variablecost.order(created_at: :asc) @variablecost_values = VariablecostValue.order("year_month asc") end def show @variablecost_value = VariablecostValue.find(params[:id]) end def new year_month_day = params[:year_month] + "-01" @year_month = year_month_day.to_date @variablecosts = Variablecost.order(created_at: :asc) @form = Form::VariablecostForm.new end def edit @variablecost_value = VariablecostValue.find(params[:id]) @variablecost = Variablecost.find(@variablecost_value.variablecost_id) end def create @form = Form::VariablecostForm.new(variablecost_form_params) if @form.save redirect_to :variablecost_values, notice: "登録しました" else redirect_to :variablecost_values, notice: "登録に失敗しました" end end def variablecost_form_params params .require(:form_variablecost_form) .permit(variablecost_values_attributes: Form::VariablecostValue::REGISTRABLE_ATTRIBUTES) end def update @variablecost_value = VariablecostValue.find(params[:id]) @variablecost_value.assign_attributes(params[:variablecost_value]) if @variablecost_value.save redirect_to :variablecost_values, notice: "情報を更新しました" else render "edit" end end def destroy @variablecost_value = VariablecostValue.find(params[:id]) @variablecost_value.destroy redirect_to :variablecost_values, notice: "データを削除しました。" end end |
一括フォームの対応
1 2 3 4 5 6 7 |
class Form::VariablecostValue < VariablecostValue REGISTRABLE_ATTRIBUTES = %i(variablecost_id year_month value description) attr_accessor :variablecost_id attr_accessor :year_month attr_accessor :value attr_accessor :description end |
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 |
class Form::VariablecostForm < Form::Base attr_accessor :variablecost_values def initialize(attributes = {}) super attributes variablecosts = Variablecost.order(created_at: :asc) self.variablecost_values = variablecosts.map { |variablecost| VariablecostValue.new(variablecost_id: variablecost.id) } unless variablecost_values.present? end def variablecost_values_attributes=(attributes) self.variablecost_values = attributes.map do |_, variablecost_value_attributes| Form::VariablecostValue.new(variablecost_value_attributes).tap { |v| puts v} end end def valid? valid_variablecost_values = self.variablecost_values.map(&:valid?).all? super && valid_variablecost_values end def save return false unless valid? VariablecostValue.transaction { self.variablecost_values.select.each { |variablecost_value| a1 = VariablecostValue.new(:variablecost_id => variablecost_value.variablecost_id, :year_month => variablecost_value.year_month, :value => variablecost_value.value, :description => variablecost_value.description) a1.save! } } true end def target_variablecost_values self.variablecost_values.select { |v| '*' } end end |
ビューの追加
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 |
<% require 'active_support/core_ext/numeric/conversions' %> <h2>変動費科目のデータ登録</h2> <p>登録年月を設定してください</p> <%= form_tag({controller: :variablecost_values, action: :new}, {method: :post}) do %> <input type="month" name="year_month"> <input type="submit"> <% end %> <h2>変動費科目 データ一覧 </h2> <% if @variablecost_values.present? %> <table> <tr> <th>登録年月</th> <th>名称</th> <th>値</th> <th>備考</th> <th>操作</th> </tr> <% @variablecost_values.each do |variablecost_value| %> <tr> <td><%= variablecost_value.year_month.strftime('%Y年%m月') %></td> <td><%= @variablecosts.find(variablecost_value.variablecost_id).name %></td> <td><%= variablecost_value.value.to_s(:delimited) %> 円</td> <td><%= variablecost_value.description %></td> <td> <%= link_to "編集", [:edit, variablecost_value] %> | <%= link_to "削除", variablecost_value, method: :delete, data: { confirm: "本当に削除しますか?"} %> </td> </tr> <% end %> </table> <% else %> <p>登録されているデータがありません。</p> <% end %> |
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 |
<% @page_title = "変動費科目 データ登録" %> <h2><%= @page_title %></h2> <div class="toolbar"><%= link_to "変動費科目データ一覧に戻る", :variablecost_values %></div> <%= form_for(@form, url: variablecost_values_path, method: :post) do |fb| %> <!-- 年月テーブル --> <table> <tr> <th>登録年月</th> <th>名称</th> <th>値</th> <th>備考</th> </tr> <% cnt=0 %> <%= fb.fields_for :variablecost_values do |f| %> <%= f.hidden_field :variablecost_id %> <tr> <td> <%= f.date_select :year_month, start_year: 2010, end_year: Time.current.year, use_month_numbers: true, discard_day: true, default: @year_month %> </td> <th> <%= @variablecosts.find(@form.variablecost_values[cnt].variablecost_id).name %> </th> <% cnt+=1 %> <td><%= f.text_field :value, size: 8 %></td> <td><%= f.text_field :description, size: 8 %></td> </tr> <% end %> </table> <div><%= fb.submit %></div> <% end %> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<h2>変動費科目 データ修正 </h2> <%= form_for @variablecost_value do |form| %> <table> <tr> <th>登録日</th> <th>名称</th> <th>値</th> <th>備考</th> </tr> <tr> <td><%= form.date_select :year_month, start_year: 2010, end_year: Time.current.year, use_month_numbers: true, discard_day: true %></td> <th><%= @variablecost.name %></th> <td><%= form.text_field :value %></td> <td><%= form.text_field :description %></td> </tr> </table> <div><%= form.submit %></div> <% end %> |
1 |
<h1>show</h1> |
トップページから固定費金額登録画面への遷移追加
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Rails.application.routes.draw do root "top#index" post "income_values/new(/:name)" => "income_values#new" post "fixedcost_values/new(/:name)" => "fixedcost_values#new" post "variablecost_values/new(/:name)" => "variablecost_values#new" resources :incomes resources :fixedcosts resources :variablecosts resources :income_values resources :fixedcost_values resources :variablecost_values end |
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 |
<h1>Simple Kakeibo</h1> <p>シンプルな家計簿アプリです。</p> <h2>科目設定</h2> <ul> <li><%= link_to "収入科目設定", :incomes %></li> </ul> <ul> <li><%= link_to "固定費科目設定", :fixedcosts %></li> </ul> <ul> <li><%= link_to "変動費科目設定", :variablecosts %></li> </ul> <h2>収支登録</h2> <ul> <li><%= link_to "収入金額登録", :income_values %></li> </ul> <ul> <li><%= link_to "固定費金額登録", :fixedcost_values %></li> </ul> <ul> <li><%= link_to "変動費金額登録", :variablecost_values %></li> </ul> |
最後に
今回は、各科目の金額を登録する機能を追加してみました。
※一応、ここまで作成したソースコードを以下から取得できます。
必要な方は以下からダウンロードしてください。
家計簿アプリソース(2)
1 file(s) 6.47 MB次は、登録したデータの収支を確認する機能を追加してみたいと思います。
それでは!
スポンサーリンク