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

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

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

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

Q&A

解決済

2回答

778閲覧

ログインユーザーの種類によって、表示するグローバルメニューを変えたい

tetsukun

総合スコア15

Ruby on Rails

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

0グッド

0クリップ

投稿2019/08/03 12:37

例えばユーザーAとユーザーBの2種類がいるとします。

ユーザーAにはグローバルメニューA、ユーザーBにはグローバルメニューBを常に表示させたいです。
railsの場合はapplication.html.erbのyield部分に記述すると全ページに反映されますが、
そうすると分けることができません。

方法としてユーザーA用のviewファイル、ユーザーB用のviewファイルを作って分けるという手もありますが、
viewを増やさずにグローバルメニューの部分だけを分けるという方法はありますか?

イメージとしては、Wantedlyというサイトの一般ユーザーと会社ユーザーで違うグローバルメニューが表示されるみたいな感じです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

view本体にも違いがあるならsuminoelさんに従うのをおすすめします。

view本体は同じでメニューだけ違うというのでしたら

<%= render partial: 'menyu' %>

みたいになっていると思いますが、ここを

<%= render partial UserTypeによってメニューの名前を変える仕掛け %>

とすればよいです。
UserTypeによってメニューの名前を変える仕掛け は色々作れると思います。
例えば

グローバル定数 MenuByUserType = { UserTypeA => 'メニューA', UserTypeB => 'メニューB' } # としておいて MenuByUserType[current_user.user_type]

追記
ユーザタイプをUserに作るとき、type とするのは避けたほうがよいかも。curent_user.type ってなってそこは美しいのですが、type ってRails の予約語になっているので、困ることが起きる可能性があります。

投稿2019/08/04 04:40

編集2019/08/04 04:42
winterboum

総合スコア23347

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

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

tetsukun

2019/08/04 17:19

ありがとうございます。グローバル定数についてですが、config>initializers>内で新しくconstants.rbを作って記述すればいいでしょうか? また上記の例に書かれているUserTypeAとUserTypeBというのは、カラム名.データの内容といった感じで記述すればいいのでしょうか?色々試していますがNameErrorが起こってうまくいきません… まだRubyの知識が定着していない初心者なので、仕掛けの作り方がよくわかりませんでした。大変申し訳ないです。
winterboum

2019/08/04 21:19

メニューAとBを使い分けるには、モデル Userのどの項目を使って分けますか? その値をUserTypeAとして使って下さい。例えば user_type というcolumnを作ってそれを使うとして、一般ユーザは1、企業ユーザは2とすると MenuByUserType = { 1 => 'メニューA', 2 => 'メニューB'} となります。 MenuByUserTypeをどこで定義するか、ですが 1案 config/initializers に定数定義のfileを作る 2案 all/helper に  def menu_by_user を作って   menu_by_user[current_user.user_type] とする
tetsukun

2019/08/05 13:51

ありがとうございます。今こんな感じでconstants.rbに記述しました。 module Constants MenuByUserType = { g_user => 'globalmenu1', c_user => 'globalmenu2' } MenuByUserType[current_user.user_attribute] end user_attributeはカラム、データ型はstringです。(typeの代わりにattributeという名前にしました) このカラムにg_userまたはc_userが入る形にしています。 ここまでは間違いないでしょうか? 次に各ファイルに<%= render partial: 〇〇〇 %>を記述したいところですが、 〇〇〇はMenuByUserTypeがそのまま入る形になるでしょうか? 上記内容で何か足りない点や誤った点があれば、ご教示いただけますと幸いです。
winterboum

2019/08/05 14:15

MenuByUserType[current_user.user_attribute] は定数定義周りではなく、<%= render partial: 〇〇〇 %>の 〇〇〇 です。 で、この constants.rbはconfig/initializersですか? model や controllerですとこれを inclde すれば使えますがviewではややこしいので、module end で囲まないで裸で書いてください。
tetsukun

2019/08/05 14:33

なるほどです。 constants.rbについてはconfig/initializers内に生成したファイルになります。 こちらの内容を下記のように修正致しました。 MenuByUserType = { g_user => 'globalmenu1', c_user => 'globalmenu2' } 次に以下の内容で、グローバルメニューを表示したい各viewファイルの先頭に記述しました。 <%= render partial: MenuByUserType[current_user.user_attribute] %> 現状まだNameErrorになるようです。。。
winterboum

2019/08/05 15:19 編集

NameErrorは MenuByUserType ですか? サーバは再起動しましたか?
tetsukun

2019/08/05 15:32

NameErrorは viewファイルに記述した <%= render partial: MenuByUserType[current_user.user_attribute] %> を指しているようです。 サーバーを再起動すると /config/initializers/constants.rb:2:in `<top (required)>': undefined local variable or method `g_user' for main:Object (NameError) from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:285:in `load' from C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:285:in `block in load'... ...といった感じでエラーを吐いてしまいます。 constans.rbの記述を消すと、正常に起動するみたいです。
winterboum

2019/08/05 21:32

ああ、 g_うせr,c_user を ’ でくくって下さい
tetsukun

2019/08/06 12:23

おお!ようやくうまくできました! 細かいところまで教えてくださり本当にありがとうございます!
winterboum

2019/08/06 13:44

エラーメッセージを示していただけたら、1往復少なくて済みましたね。 そのように心がけて下さい
guest

0

CanCanCan等の権限管理gemを利用してみたらどうでしょうか。
Railsの権限管理CanCanCanのソースコードリーディング

もしくは、users tableuser_typeのようなカラムを設けて、登録させるときに「一般」「企業」の選択をさせ、valueuser_typeに保存。
ログインしているユーザーのuser_typeによって表示内容を切り分ける、とかですかね。

自分もよくやりがちですが、view内で切り分けて全部ハードコーディングはおすすめしませんよ…。
viewを分けた方がメンテナンスしやすいです…。

投稿2019/08/03 16:15

suminoel

総合スコア80

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問