カテゴリー
コンピューター

CakePHP2 のアクションが無い場合のエラー内容★ご質問の調査★

次の投稿に、次のコメントいただきました。ありがとう存じます。

参考させていただきました。
こちらは、秀和のと同じようですが、本のように追加メソッドとは違いますが、
delRecordの前記は必要になるのですか?

このご質問をきっかけとして、お答えしながらも、久しぶりに CakePHP をさわってみたいと存じます。

まず、本とはこちらのことです。ご質問の方のご推測通り、秀和の本です。お勉強で投稿し、ご質問いただいた箇所は、P130 〜 P132 3-2 データベースの基本的な操作 レコードの削除、です。

まずは環境づくりです♪久しぶりのインストールはすでに済ませました♪

0.質問の整理

質問の重要な部分を抜書きいたします。

本のように追加メソッドとは違いますが、
delRecordの前記は必要になるのですか?

「本のように追加メソッドとは違いますが」の部分については、申し訳ございません。わたくしは追加メソッドとした認識でおります。BoardsController.php に delRecord() を追記しており、これをもって追加メソッドと考えております。

「delRecordの前記は必要になるのですか?」ですが、これは前記とはなにか、がポイントですわね。つぎのように解釈させていただきます。

  • 前記 = index() および addRecord() の他のメソッド

そうしますと、ご質問は次のように言えるかと存じます。

  1. index() が無く、addRecord() と delRecord() のみでも動くのですか?
  2. addRecord() が無く、index() と delRecord() のみでも動くのですか?
  3. index() および addRecord() が無く、delRecord() のみでも動くのですか?

今回、この3パターンを調べようと思います。

予想といたしましては、2番めのみの「index() と delRecord() のみでも動く」です。

1.データベースのセットアップ

CakePHP をインストールした段階では、MySQL はセットアップされませんのでデータベースがなければ作成し、そしてテーブルも作ります。今回は、データベースは作ってありましたのでそれを再利用し、テーブルは参考本通りの構造とするために次の SQL で作成し、サンプルデータを挿入いたしました。

create table boards (
    id int not null auto_increment,
    name VARCHAR(255) NOT NULL,
    title VARCHAR(255) NOT NULL,
    content TEXT NOT NULL,
    created datetime,
    modified datetime,
    primary key (id)
);

INSERT INTO boards (id, name, title, content) VALUES (1, 'tuyano', 'test', 'this is test');
INSERT INTO boards (id, name, title, content) VALUES (2, 'hanako', 'hello', 'Hello!');

database.php.default をコピーして database.php を次のように編集してデータベース情報を設定いたしました。

Config/database.php

        public $default = array(
                'datasource' => 'Database/Mysql',
                'persistent' => false,
                'host' => 'localhost',
                'login' => 'cakeuser',
                'password' => 'passwordnari',
                'database' => 'cakedb',
                'prefix' => '',
                'encoding' => 'utf8',
        );

CakePHP アプリケーショントップページを表示させまして、データベースへアクセスできることを確認いたしました。

大変懐かしいです♪

2.前回の投稿のソースを作成、動きを確認

の「cake/sample/app/Controller/BoardsController.php」「cake/sample/app/View/Boards/index.ctp」を作成し、ID による検索、登録、ID による削除ができることを確認いたしました。

3.ご質問の内容を試してみる

3−1.index() が無く、addRecord() と delRecord() のみでも動くのですか?

面倒ですので、ビューの index.ctp には手を加えませんでした。Controller/BoardsController.php の、index() をまるまる削除し、CakePHP のトップページへとアクセスしてみます。

予想通り、エラーとなりました。

Missing Method in BoardsController

Error: The action index is not defined in controller BoardsController

Error: Create BoardsController::index() in file: sample/Controller/BoardsController.php.

<?php
class BoardsController extends AppController {

<strong>
	public function index() {

	}
</strong>
}

Notice: If you want to customize this error message, create sample/View/Errors/missing_action.ctp

Stack Trace

要するに、index() が BoardsController.php に定義されていないからエラーとなったよ!作って作って!、ということでございますね。

これは CakePHP の決まりとして、コントローラーには URL のファイル名と一致するメソッドを定義しなければならない、というものがございます。これに引っかかった形となりますわ。

ウェブブラウザでは http://example.com/cake/sample/boards/ といった形でアクセスいたしますが、boards/ の後に何もなければ index.html か index.php が補完されるような設定になっております。

したがって、index.php にアクセスしようとしたものの、index() メソッドがないのでエラーとなったということでございますね♪

3−2.addRecord() が無く、index() と delRecord() のみでも動くのですか?

実際に試したところ、なんのエラーもなく、削除が可能でございました。

ただしもちろん、addRecord アクションを削除しておりますので、データの登録はできませんの。

3−1.の場合と同じエラーが表示されますの♪

3−3.index() および addRecord() が無く、delRecord() のみでも動くのですか?

こちらも、動きません。そもそも index アクションがございませんので、初期表示の段階で3−1.と同じエラーが表示されますの。

もし、どうしても動かしてみたいということでございましたら、方法が無いことも無いと存じます。

それは、http://example.com/cake/sample/boards/delRecord/ にアクセスいたしまして、その時同時に POST で削除したいレコードの id をサーバに送信すればよろしいですわね。

おわりに

すっかり CakePHP はご無沙汰でしたわ。1年以上経っていましたかしら。。。ですのでコントローラーやビューの作成はもちろん、アクションがない場合のエラーの拝見も、すべてが久しぶりでした。なんだか新鮮でしたの♪

また CakePHP 触りたいですの♪今回はご質問に応える形で触ることができて嬉しかったですわ。ご質問、ありがとう存じます♪

以上です。

「CakePHP2 のアクションが無い場合のエラー内容★ご質問の調査★」への2件の返信

大変丁寧に本当に感謝します。
色々、試しましたが、本の通りに出来ること出来ないことは、環境により違ってくるものだなと
実感しました。
最後に、
p 210 3-112
ですが、211ページの様にビューが出まして、実際にパスワードを打つと
エラーが public function edit($param){
の部分みたいなんです。
add 追加メソッドから コントローラーに追加して記述しておりますが、
何か邪魔になってる記述があるのかなと思います。

210ページの部分の追加メソッドで
コントローラーの中は
前記述がどうなっているか
教えていただけますか?

コメントありがとう存じます。
おそらくでございますが、

  • 編集ページの初回表示時はエラーでない
  • 「送信」クリック時にワーニングがでる

かと予想します。わたくしも同じ問題に遭遇いたしました。
そのときの問題解決方法も含めて投稿しておりますのでよろしければご参照下さい。
解決につながりましたら、大変嬉しく存じます。
CakePHP2 で掲示板アプリ作り!不満をメモに残します!勉強しました! | oki2a24

原因は、Warning メッセージにもあるかと存じますが、アクションへ送られるはずのパラメータが無いためです。
従いまして、パラメータがない場合の初期値を関数定義で設定いたしますと、解決できるかと存じます。
この手法は、公式ドキュメントのチュートリアルでも見受けられますので、問題ないやり方ですわ。
ブログチュートリアル – レイヤーの追加 — CakePHP Cookbook v2.x documentation

この秀和の本は、ソースが間違えていたり、コーディングが美しく感じられなかったり、すこし問題があり、ずっと座右におくには難しい部分があると感じました。わたくしの場合、この本に詰まった時やこの本の後は、公式のドキュメントを軸に勉強を進めていきましたら、スムースに進みましたの。
差し出がましく恐縮でございますが、参考になりましたら幸いです。

コメントを残す