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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Vagrant

Vagrantは、VirtualBox上の仮想マシンを コマンドラインから作成してくれるソフトウェアです。 ビルド環境など容易に構築が可能です。

Q&A

解決済

3回答

599閲覧

Railsでの表示ページの切り替え方法について教えてください。

koume

総合スコア458

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Vagrant

Vagrantは、VirtualBox上の仮想マシンを コマンドラインから作成してくれるソフトウェアです。 ビルド環境など容易に構築が可能です。

0グッド

0クリップ

投稿2017/09/13 14:36

Railsアプリケーションプログラミングの勉強中です。
あるテーブルにデータが登録されているかいないかで表示するページを切り替えたいのですが上手く切り替わってくれません。
条件分岐で切り換えができると思うのですが以下のコードでは切り換えをせずにデータがあっても無くてもdashboard_bが
表示されてしまいます。(データの存在をチェックしていないので当然だと思います。)

class Customer::TopController < Customer::Base skip_before_action :authorize def index if Bank.find_by(params[:id]) render action: 'dashboard_b' else render action: 'dashboard_a' end end end

テーブルの構造は以下のようになっています。
customerテーブルとbanksテーブルは1対1で関連付けされています。
参照先のテーブル customers # has_one :bank
参照元のテーブル banks # belongs_to :customer
・banksテーブルには外部キー customer_id があります。
そのほか
・bk_name
・office
・account
・acc_name
・acc_name_kana
のカラムがあります。

そこでログインに成功したcustomerに関連付けされたbanksテーブルにデータが登録されているかいないかを判断し、表示されるページを
'dashboard_b'と 'dashboard_a' に切り換えたいのですが記述方法がわからないのでどなたか教えていただけないでしょうか?
条件分岐の記述を以下のようにいろいろ変えてやってみましたが全て同じNoMethodErrorが発生してしまいます。

エラー内容 NoMethodError in Customer::TopController#index undefined method `bank_id' for nil:NilClass Extracted source (around line #5): 4 def index 5 if Bank.find(current_customer.bank_id) 6 render action: 'dashboard_b' 7 else 8 render action: 'dashboard_a'
試したコード if Bank.find(current_customer.bank_id) # bank_idメソッドは作っていないのでエラーがでました。 if Bank.find_by(current_customer.bank_id) if Bank.find_by(current_customer.customer_id) if Bank.find_by(customer_id) if Bank.find_by(bk_name) などです。

どう記述すればログイン者と関連付けされたbanksテーブルの記述の有無をチェックし表示を切り替えることが
できるのでしょうか?自力ではどうしようもない所まで悩んでいます。どなたか教えていただけないでしょうか?
宜しくお願いします。

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

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

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

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

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

guest

回答3

0

モデルの参照は主にfindとfind_byになると思います。
find()の引数はそのモデル内のidを指定します。
find_by()はそのモデルのカラム、値を指定します。

例えばbanksテーブルに
id:1,customer_id:12345
id:2,customer_id:67890
とあったとして

ruby

1Bank.find(1) #Bankモデルのid:1を探す。 2Bank.find_by(customer_id: 12345) #Bankモデルのcustoner_idカラムの値が12345のものを探す。

で同じモデルを参照する形になります。
findに渡すのはint
find_byは基本的にキーと値がペアです。

なので今回は
1.indexに来たらcurrent_customerにCustomerモデルを与える
2.find_byでcustomer_idカラムにcurrent_customerのidで参照する
という流れになるかと。

ruby

1def index 2 current_customer = Customer.find(1) #Customerモデルから参照する。(findの引数は適当です) 3 if Bank.find_by(customer_id: current_customer.id) 4 ~ 5end

投稿2017/09/14 00:18

ys3128

総合スコア21

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

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

koume

2017/09/14 09:22

お礼が遅くなり大変申し訳ありませんでした。教えていただいたコードで 上手くいきそうです。今後とも宜しくお願い申し上げます。
guest

0

mtdsnskさんとys3128さんのおかげで自分なりにrails consoleで試して解決できました。以下はコードです。
class Customer::TopController < Customer::Base
skip_before_action :authorize

def index
if current_customer
customer = Customer.find_by(id: current_customer.id)
end

if current_customer if Bank.find_by(customer_id: customer.id) render action: 'dashboard_b' else render action: 'dashboard_a' end else render action: 'index' end

end
end
ありがとうございました。今後とも宜しくお願いします。

投稿2017/09/14 13:50

koume

総合スコア458

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

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

0

ベストアンサー

Bank.find_by(customer_id:current_customer.id)

だとどうですか?

投稿2017/09/13 21:17

mtdsnsk

総合スコア789

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

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

mtdsnsk

2017/09/13 21:19

まずrails consoleでモデルの操作をする方法の勉強をした方が近道ですよ
koume

2017/09/14 09:28

お礼が遅くなり大変申し訳ございません。現在、rails consoleでいろいろ 試しています。教えていただいたコードで上手くいきそうです。 rails consoleで試したところbanksテーブルのデータを思った通りに検出できました。今後とも宜しくお願いします。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問