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

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

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

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

Q&A

解決済

2回答

423閲覧

各Controllerで共通して使用する値を、1ヵ所で管理できる様にしたいです。教えて頂けますと大変嬉しいです。

akikko

総合スコア32

Ruby on Rails 5

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

0グッド

0クリップ

投稿2023/03/11 07:48

実現したいこと

User controller  / Deposit contoroller
の両方で、手数料率や税率等、共通する全く同じ値を共有したい。

共通させたいパラメータ

ruby

1stripe_fee = 3.6 2fee1 = 21.4 3fee2 = stripe_fee + fee1 4commission_rate = 1.0 * 75 / 100 5commission_rate_new = 1.0 * (100 - fee2) / 100 6transfer_fee = 300 7new_fee_day = Date.new(2023,4,1) #4月1日より手数料変更

これらの値を、各コントローラーで、呼び出したいです。
puts fee.stripe_fee → 3.6
と表示されてるといった事ができるようにしたいです。

どうしても実装することができません。
大変お手数おかけいたしますが、教えて頂けますと本当にうれしいです。

前提

Railsでクラウドファンディングのようなアプリを開発・運営しております。
キャンペーンなどで、手数料率を変更することがあるのですが、
そのたびに同じ修正を各コントローラーで変更する必要があり、記入漏れ等の管理に困っております。

試したこと

concernでmoduleを作成して、各コントローラーで呼び出すことにて良いのかと考え、
以下のように実装

参考記事
https://qiita.com/sssssatou/items/d5c64a073fe1211dbe49


controllers/concerns/fee.rb

ruby

1module Fee 2 extend ActiveSupport::Concern 3 4 stripe_fee = 3.6 5 fee1 = 21.4 6 fee2 = stripe_fee + fee1 7 commission_rate = 1.0 * 75 / 100 8 commission_rate_new = 1.0 * (100 - fee2) / 100 9 transfer_fee = 300 10 new_fee_day = Date.new(2023,4,1) 11 12end

users_contoroller.rb

ruby

1class UsersController < ApplicationController 2 include Fee 3 4 def show 5  puts Fee.stripe_fee 6 end 7end 8

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

undefined method `stripe_fee' for Fee:Module

参照ページと同じ、puts Fee::stripe_feeにて記載した場合も同様のエラーが表示されております。

そもそものやり方や、基本が間違っているのかもしれません。

どなたかアドバイスを頂けると本当に助かります。
どうぞよろしくお願い申し上げます。

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

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

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

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

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

guest

回答2

0

解決済みではありますが、、、
私でしたら
Fee は moduleではなく class にします。
models/concerns/fee.rb に置いて、

class Fee def self.stripe_fee 3.6 end end

呼ぶときは puts Fee.stripe_fee

投稿2023/03/13 23:41

winterboum

総合スコア23416

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

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

akikko

2023/03/16 08:00

大変ご丁寧にありがとうございます!! 項目が多いのですが、 その場合は、def endで全項目を定義されるイメージでいらっしゃいますでしょうか??
winterboum

2023/03/16 11:49

そうです。 定義数はmoduleと同じですがね。 classの方がよいと思っているのは、 moduleですと 計算のための定数をひとまとめにしたという 感じになりますが classとして独立させると、 料金 というまとまりとして扱える様になるから、です。 もっと言うならば、AR にして、DB に 残すようにすれば、料金の変遷にも対応しやすくなります。プログラムを修正するのではなく、DBに 2023/4/1からの料金 というデータを追加するだけ
guest

0

ベストアンサー

参照ページと同じ

全く違います。モジュール直下でのstripe_fee = 3.6は、単なるローカル変数(スコープはモジュール直下のコードだけ)への代入で、メソッド定義とはなりません。

投稿2023/03/11 08:20

maisumakun

総合スコア145208

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

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

maisumakun

2023/03/11 08:27

固定の値を取れればいいのであれば、定数を作って活用することをおすすめします。
akikko

2023/03/11 08:38 編集

ご回答ありがとうございます。すいません、定数を作るというのは、 文字列にするということでしょうか? 参考の記事の場合、MESSAGE = "Hello World!"となっております。 stripe_fee = "3.6" にしましても、上記と同じundefined methodエラーが出てしまっております。 大変お手数おかけいたしまして申し訳ございませんが、教えて頂けますと大変助かります。
maisumakun

2023/03/11 08:40

大文字で始まる名前に代入すると、定数として扱われます。小文字では変数です。
akikko

2023/03/11 11:39

なるほど・・・大文字と小文字で違っていたのですね。。基本的なところで間違っておりました。 教えて頂きまして解決いたしました!本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問