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

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

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

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

5280閲覧

CakePHPで$this->renderが効かない

smnsmn

総合スコア175

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2016/05/12 08:59

編集2016/05/12 09:10

CakePHP2系です。
4行目、gethogehoge($id)で、DBから$idをもとにfindしています。
findの結果がfalseだった場合、notfound.ctpを表示させるため、下記のように処理しているのですが
真っ白のページが表示されてしまいます。

debugさせてみると、真っ白のページにデバッグ内容が表示されるので処理は通っているはずです。
Controllerとactionもあっていました。
$hogeにはfalseが入っています。

PHP

1public function hogehoge(){ 2 3 $id = $this->request->params['id']; 4 $hoge = $this->Hoge->gethogehoge($id); 5 6 debug($id); 7 debug($hoge); 8 debug($this->name); 9 debug($this->action); 10 11//notfoundを表示 12 if($hoge === false){ 13 $this->render('notfound'); 14 //$this->redirect('/'); これだとちゃんとリダイレクトされる 15 } 16} 17

なぜrenderされないか、原因と思われることはありますでしょうか?
ちなみに、renderをifから出し、$idが存在する場合も問答無用でnotfound.ctpを表示させると、
ちゃんと表示されますが、$idがfalseだとやはり表示されません。

renderの位置をどこにしても、$idがfalseだとrenderされません。
デバッグは表示されます。(なので処理は通ってるはず・・・)

ご教授頂けますと幸いです。
よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

$this->Video->gethogehoge($id)の仕様が分かりませんが、レコードが取得できないときに、きちんとFalseが返却されていますか?

すみません、質問を読み違えてました。
redirect()は、redirect内でexitが働くので、redirect()以降に処理が進まないのですが、render()はレンダリングした後に処理が進んでしまいます
ですので、

CakePHP

1 if($hoge === false){ 2 $this->render('notfound'); 3 return; 4 }

としてみてください

投稿2016/05/12 09:03

編集2016/05/12 09:22
KatsumiTanaka

総合スコア924

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

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

smnsmn

2016/05/12 09:14

コメントありがとうございます。 はい、返り値については、debugでfalseが返っていることを確認しております。 if内でコメントアウトしておりますが、redirectした場合はきちんと処理が実行されます。 また、下記のようにどのような場合でもrenderさせた場合でも、 $idがtrueならrenderされますが、falseだと真っ白のページになってしまいます。;;;; public function hogehoge(){ $id = $this->request->params['id']; $hoge = $this->Hoge->gethogehoge($id); $this->render('notfound'); }
KatsumiTanaka

2016/05/12 09:26

すみません、コードを書くために、最初の回答のほうを編集しました
smnsmn

2016/05/12 10:42

ご説明ありがとうございます! returnを追加したところ、上手く動作致しました。 ありがとうございます。 後学のために可能でしたら教えていただきたいのですが、 >redirect()は、redirect内でexitが働くので、redirect()以降に処理が進まないのですが、render()はレンダリングした後に処理が進んでしまいます とのことですが、例えばaction内の一番最後でrenderしたときも上手く行きませんでした。 これはactionを読んだ以後の処理が別の場所で行われているからでしょうか? 今まで、renderのみでも動作していたので、今回何故このような挙動になったのかがしっかりしっかり理解できておらずで・・・ ともあれ、 >edirect()は、redirect内でexitが働く というのも知りませんでした。 とても勉強になりました。ありがとうございましたm(__)m
KatsumiTanaka

2016/05/12 11:19

>これはactionを読んだ以後の処理が別の場所で行われているからでしょうか? autorenderがONになっていると、controllerの該当メソッドが終了した後で、自動的にそのメソッドに対応したviewのレンダリングが呼ばれてしまいます なので、render()を呼び出して別の画面を表示するときは、明示的にレンダリングの後で処理を終わらせる必要があります
smnsmn

2016/05/12 12:41

そうだったのですね。Cakeの仕様を理解しきれていなかったようです。 ご丁寧に回答頂き、ありがとうございましたm(__)m勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問