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

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

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

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

Q&A

1回答

274閲覧

Rails viewにインスタンスが渡せない

d04062

総合スコア111

Ruby on Rails

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

0グッド

0クリップ

投稿2022/09/28 04:21

編集2022/09/28 13:56

コントローラー内のインスタンス変数は、
before_actionすればviewで使えますが、
viewから呼んだ場合は使えないようです。

ruby

1#コントローラー.rb 2before_action :test 3def test 4 @test = "てすと" 5end 6 7#ビュー.erb 8<% -p @test %> 9=> "てすと" 10 11 12#コントローラー.rb 13helper_method :test 14def test 15 @test = "てすと" 16end 17 18#ビュー.erb 19<% -test %> 20<% -p @test %> 21=> nil

何か良い方法はあるでしょうか?
アドバイス頂けますと幸いです。

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

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

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

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

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

d04062

2022/09/28 04:30 編集

【補足】やりたい理由 ビューから複数回メソッドを呼び出し、インスタンス変数を書き換えたいためです。 「同じインスタンス変数名なのに中身が変わっていると良くない」というのはあるのですが、 「このメソッドを他のアクションからも使いたいためビュー内に書いてローカル変数で使う、のではなく、コントローラー内に書きたい」 といった理由です。
guest

回答1

0

viewから呼んだ場合は使えないようです。

ご提示のコードでは、testメソッドを呼んでいません。

投稿2022/09/28 04:25

maisumakun

総合スコア145121

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

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

maisumakun

2022/09/28 04:29

helper_method :testは、testメソッドをビューから呼び出すヘルパーとして使えるよう「設定」するだけです。この行だけではメソッドは実行されません。
d04062

2022/09/28 04:33

サンプルのコードが間違っていました。 <% -test %> で実行しても、nilになってしまいます。
d04062

2022/09/28 04:35

補足です。 <% -test %>によって、testメソッドの実行されているのですが、インスタンス変数は渡せないです。
maisumakun

2022/09/28 04:35

ビューに渡されるインスタンス変数は、ビューを表示する段階でコピーされています。ビューからtestを呼び出しても、書き換わるのはコントローラー側の@testだけで、コピーされた後のビューでの@testに影響はありません。
d04062

2022/09/28 04:38

はい、おっしゃる通りでした。 ビューから複数回メソッドを呼び出して、変数を書き換えたい場合は、ビュー内にメソッドを書くしか無いでしょうか? 他のアクションからもこのメソッドを使うので、コントローラーに書ければと思ってます。
maisumakun

2022/09/28 04:44

そこまで大掛かりなアクションを行うのであれば、「表示処理をビューに書く」ことそのものが妥当ではないのかもしれません。 適当なクラスで出力したいHTMLを作り上げて、ビューではそれを表示するだけ、という方が向いているかもしれません。 (「何のために」変数を書き換えたいかがわかっていない以上、コメントしづらいです)
d04062

2022/09/28 04:51

具体的には、カレンダー表示機能を作っていまして、 showアクションでは、特定の日付のインスタンス変数を使い、 indexアクションでは、全日表示のため、インスタンス変数を書き換える必要がある といった内容になります。
maisumakun

2022/09/28 04:56

> 全日表示のため、インスタンス変数を書き換える必要がある 必要な部分をパーシャルにして(ローカル)変数を渡す、というほうがスッキリ書けそうな印象です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問