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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1466閲覧

Rails: 継承について

rails_ruby

総合スコア87

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/04/04 10:22

編集2019/04/04 11:05

##実現したい事
Bookingコントローラーでcreateした時の値を現在はクエリパラメータに乗せてデータを渡し、遷移先のコントローラーでクエリパラメータを受け取るように形で遷移寺のデータ受け渡しをしているが、それを継承で渡せるようにしたい。
##困っている事
継承の文法については知っているが、どのように書けば良いか分からないです。。
BookingsControllerと ExperiencesControllerを用いて、どのように書けばよりかご教示いただけると幸いです。

ruby

1#継承の一般的な書き方。 2class SuperMyClass 3end 4 5class MyClass < SuperMyClass 6end

ruby

1#BookingsController 2class BookingsController < ApplicationController 3 def create 4 @booking = Experience.new(menu_params) 5  #下記のparamをexperiencesControllerのshowに継承したい。 6 param = params[:experience][:booking_course_name].gsub(/[^\d]/, "").to_i 7 redirect_to experience_path(params[:experience][:host_id],experience: param) 8 end 9end

ruby

1#ExperiencesController 2class ExperiencesController < ApplicationController 3 4 def show 5 @user = User.find(params[:id]) 6 @bookings = Experience.all 7 @booking = Experience.new 8 @course = ["60分コース", "120分コース", "180分コース", "240分コース"] 9 end 10end

##追記
クエリパラメータ以外にもグローバル変数を使い力技で,他のコントローラーに変数の中身を渡してみました。

ruby

1class BookingsController < ApplicationController 2def create 3 @booking = Experience.new(menu_params) 4 $ccc = params[:experience][:booking_course_name] 5 param = params[:experience][:booking_course_name].gsub(/[^\d]/, "").to_i 6 redirect_to experience_path(params[:experience][:host_id],experience: param) 7 end 8end 9$a = $ccc

ruby

1#ExperiencesController 2class ExperiencesController < ApplicationController 3 4 def show 5 @@kei = $a #グローバル変数で無理くり取得した 6 @user = User.find(params[:id]) 7 @bookings = Experience.all 8 @booking = Experience.new 9 @course = ["60分コース", "120分コース", "180分コース", "240分コース"] 10 end 11end

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問者様の質問要件の把握が出来ていないのかもしれませんが、
同じコードを別々のクラスで使いたいということならば
concernsフォルダの中にmoduleを作るという方法があります。

concerns/params_module.rb

Ruby

1module ParamsModule 2 extend ActiveSupport::Concern 3 4 private 5 6 def params_processing 7 params[:experience][:booking_course_name].gsub(/[^\d]/, "").to_i 8 end 9end

上記で使用したいメソッドを含んだmoduleを作成しておき

Ruby

1class ExperiencesController < ApplicationController 2 include ParamsModule 3 4 def show 5 param = params_processing 6 # その他処理 7 end 8end

メソッドを使用したいclass内でinclude句を使用して該当moduleを取り込むと、module内で定義したメソッドを利用できます。
このメソッドがいろいろなクラスで使用する共通処理ならば、各クラスでincludeしてあげると
コードに修正が必要になった場合、
concerns/params_module.rbを修正するだけですので、DRYになりますね。
キーワード[rails concerns]等でネットで調べると理解が進むと思います。

投稿2019/04/04 22:52

ReiLeiLei1025

総合スコア236

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

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

rails_ruby

2019/04/05 05:20

ご教示いただきありがとうございます。 意図下処理を実装することできました。 加えて一点だけお聞きしたいことがあるのですが、クラス外に値を渡したいときにグローバル変数を使うのはなるべく避けたほうがいいのでしょうか? ruby初心者であまり詳しくないためご教示いただけけると幸いです。
ReiLeiLei1025

2019/04/05 14:00

自分はRailsではグローバル変数は使わないですね。 クラスの外に持ち出すならsessionを使う方法があります。sessionを自作のヘルパーメソッドでラップするとコードが何を行っているのかが分かりやすくなります。 Controller→Viewならもちろんインスタンス変数で渡せばいいですし、 リダイレクトを使用するController→Controllerの流れなら、redirect_to のパスの中に渡したいもの(渡すことが出来るのであれば)をクエリで渡すという方法があります。 例:データベースに画像が入っているのであればそのidなど
ReiLeiLei1025

2019/04/05 14:37

ちょっと気になってRailsでのグローバル変数の使い道を調べたのですが、いいのが見つかりませんでした。 スコープが広すぎるのです。 質問者様のコードだとBookingControllerとExperiencesControllerでしか$aを使わないのに他のControllerでも読み書き出来てしまうのが問題です。 知見のある方の記事です。参考になれば幸いです。 https://teratail.com/questions/69454
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問