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

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

ただいまの
回答率

87.34%

Railsで月次ページの作成方法

解決済

回答 1

投稿 編集

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

score 18

質問の背景

Railsで家計簿アプリを作成中。
Deviseをインストール済み。
Paymentsコントローラを作成済み。

質問

支払い一覧ページを作成しました。
一覧ページには今月の支払いだけを表示するようにしています。
前月・前々月に遡ってデータを表示する機能を搭載したいのですが、どのようにするものでしょうか。
アイディアがなく、お知恵をお借りできましたら幸いです。

該当のソースコード

routes.rb

Rails.application.routes.draw do

  resources :payments, only: [:index, :new, :create, :edit, :update, :destroy]

  devise_for :users, :controllers => {
  :registrations => 'users/registrations',
  :sessions => 'users/sessions'
}

devise_scope :user do
  root :to => "devise/sessions#new"
  get "user/:id", :to => "users/registrations#detail"
  get "signup", :to => "users/registrations#new"
  get "login", :to => "users/sessions#new"
  get "logout", :to => "users/sessions#destroy"
  get "forgot", :to => "users/passwords#new"
end
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

payments_controller.rb

class PaymentsController < ApplicationController
  include PaymentsHelper

  PER = 5

  def index
    payments_this_month
    @payments = @payments_this_month.page(params[:page]).per(PER)
  end

  def new
    @payment = current_user.payments.new
  end

  def create
    @payment = current_user.payments.new(payment_params)

    if @payment.save
      redirect_to new_payment_path, notice: "支払い「#{@payment.item}」を登録しました。"
    else
      render :new
    end
  end

  def edit
    @payment = current_user.payments.find(params[:id])
  end

  def update
    @payment = current_user.payments.find(params[:id])

    if @payment.update(payment_params)
      redirect_to payments_path, notice: "支払い「#{@payment.item}」を更新しました。"
    else
      render :edit
    end
  end

  def destroy
    @payment = current_user.payments.find(params[:id])
    @payment.destroy
    redirect_to payments_path,  notice: "支払い「#{@payment.item}」を削除しました。"
  end


  private

    def payment_params
      params.require(:payment).permit(:item, :price, :category)
    end




end

payment.rb

class Payment < ApplicationRecord
  validates :item, presence: true, length: { maximum: 10}
  validates :price, presence: true, numericality: { only_integer: true }, length: { maximum: 15}
  validates :category, presence: true, length: { maximum: 10}

  belongs_to :user



end

index.html.erb

<div class="container pt-3 text-center">
  <h2>家計簿一覧</h2>
</div>

<div class="row py-3  h-75 justify-content-center">
  <div class="card" style="width:calc(20% - .25rem)">
  <div class="card-body">
<h3><%= this_month.month %></h3>
  </div>
  </div>
</div>

<div class="row py-3 justify-content-center">
  <div class="card" style="width:calc(50% - .25rem)">
  <div class="card-body">

<h3>支払総額 <%= sum_payment_this_month %></h3>

  </div>
  </div>
</div>


<div class="container">
<div class="row justify-content-center">

<a class="btn btn-warning w-25 mx-3" href="payments/new" role="button">支払い登録</a>
<a class="btn btn-success w-25 mx-3" href="signup" role="button">傾向チェック</a>

</div>
</div>

<div class="row py-3 justify-content-center">
  <div class="card" style="width:calc(50% - .25rem)">

 <div class="card-body">

<table class="table table-bordered">
<thead class="thead-dark">
  <tr>
    <th class="text-center"><%= Payment.human_attribute_name(:created_at) %></th>
    <th class="text-center"><%= Payment.human_attribute_name(:item) %></th>
    <th class="text-center"><%= Payment.human_attribute_name(:price) %></th>
    <th class="text-center"><%= Payment.human_attribute_name(:category) %></th>
    <th></th>
    <th></th>
  </tr>
</thead>

  <% @payments.each do |payment| %>

    <tr>
      <td class="text-center"><%= payment.created_at.strftime('%Y/%m/%d') %></td>
      <td class="text-center"><%= payment.item %></td>
      <td class="text-right"><%= payment.price %></td>
      <td class="text-center"><%= payment.category %></td>
      <td class="text-center"><%= link_to '編集', edit_payment_path(payment) %></td>
      <td class="text-center"><%= link_to '削除', payment, method: :delete, data: { confirm: "本当に削除しますか?"} %></td>
    </tr>

  <% end %>

</table>

<div class="row justify-content-center">
  <%= paginate @payments %>
</div>


</div>
</div>
</div>

payments_helper.rb

module PaymentsHelper

  def this_month
    Date.today
  end

  def payments_this_month
    @payments_this_month = current_user.payments.where(created_at: this_month.in_time_zone.all_month)
  end

  def sum_payment_this_month
    sum = 0
    payments_this_month
    @payments_this_month.each { |n| sum += n.price}
    sum
  end


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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

def payments_this_month  が見当たりませんが、、、、
def index   month = params[:month] || Date.today   @payments = Payment.where(date: month.all_month).                 page(params[:page]).per(PER) end
辺りでは。
view index で月を変える仕掛けはお任せ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/08/13 14:05 編集

    回答、ありがとうございます。
    すみません。helper追記しました。(def payments_this_month)

    ```
    month = params[:month] || Date.today
    ```
    indexページにくる時に、月の値を送信させるような感じですよね?

    >view index で月を変える仕掛けはお任せ。

    ここにどんな方法があるのか、知りたいです、、、
    月毎にページ用意する感じでしょうか。
    それとも、indexページ一つで月を変更する仕組みも、ありえるのでしょうか。

    キャンセル

  • 2019/08/13 14:21

    何ヶ月も先に飛ばすのでなければ
    <%= link_to "前月",payments_path(month: @month.prev_month) %>
    でしょうか。
    def index で month を @month に直しておいて。
    あ、 month = params[:month] || Date.today だとエラーになるかな
    @month = parse(params[:month] ? Date.parse(params[:month) : Date.today
    かな。

    キャンセル

  • 2019/08/13 14:27

    高度なテクニックに衝撃です。
    解読します。ありがとうございます。

    キャンセル

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

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

関連した質問

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