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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

344閲覧

include されたmoduleからincludeしたclassのclass定数を参照する方法

winterboum

総合スコア23347

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/05/17 00:17

登録項目数がべらぼうに多いので数stepの画面で登録するというアプリを引き継ぎました。
validationがほとんどなされていなかったので手を入れていますが、そのDRYで行き詰まってます。

class Host < ApplicationRecord Requiers = { stage1: [:email,:nickname], stage2: [:item1,:item2] } RequirsBylingual = { stage1: [:name], stage2: [:address] } Requirs.each do | validate_type,syms| with_options if: -> { @validate_type == validate_type } do validates *syms,presence: true end end RequirsBylingual.values.flatten.uniq.each do | sym | eval("def #{sym}_translations_valid? # ここにごちょごちょ  end ") end # evalの中で呼んでるmethod def translations_valid? sym,ja_en # ごちょごちょ end

みたいに実装してうまく行ったのですが、問題はHostがhas_many,has_oneしている沢山のclassにこれを展開するにあたり、DRYしようかと

Requiers = { } RequirsBylingual = { } include VaridateHelper

としたところ VaridateHelper::Requiers がないというエラー。
class定数でなくても良いのですが、includeしたclassて定義したものをincludeされた方で参照するということは無理でしょうか。

試したこと

def request; { } ;end def self.request; { } ; end @request = { } @@request = { } module側で self.class::Requests
いずれもだめでした。
selfってインスタンスかとおもっていたのですが、includeされたmoduleをさしてました。

あとは、
継承を1段かますのでしょうか。。。。

include されたmoduleで参照できる手があると他にも出来ることが増えるので、お知恵をお借りしたい次第です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こういうことでしょうか?

ruby

1module ValidateHelper 2 def self.included(kls) 3 requires = kls::Requiers 4 requires_by_lingual = kls::RequirsBylingual 5 end 6end 7 8class Host 9 Requiers = { 10 stage1: [:email,:nickname], 11 stage2: [:item1,:item2] 12 } 13 RequirsBylingual = { 14 stage1: [:name], 15 stage2: [:address] 16 } 17 include ValidateHelper 18end

投稿2020/05/17 00:48

asm

総合スコア15147

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

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

winterboum

2020/05/17 01:03

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

2020/05/17 05:12

道半ばというところでしょうか 定数の参照は出来るようになり、いろいろありましたがなんとか Hostについては通りました。 has_one なものに展開しているところでうまく行っていませんが、一番の問題は解決しましたので、この質問は解決といたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問