1

私はRuby on Railsの超初心者です。ほんの数時間前に Ruby と Ruby on Rails の両方を学び始め、その DRY 原則を自分の Laravel コードに適応させようとしました。

これは私のRoRがどのように見えるかです:

class WeddingController < ApplicationController

    before_filter :get_wedding

    def get_wedding
        /*
           If Wedding.find(2) returns false, redirect homepage
           Else, bind @wedding into all methods for use
        */
    end

    def edit
        @wedding //this method has access to @wedding, which contains Wedding.find(2) data.
    end

    def update
        //Same as above method
    end

    def destroy
        //Same as above method, can do things like @wedding.destroy
    end
end

これは私のLaravelがどのように見えるかです

class Wedding_Controller extends Base_Controller {

public function edit($id)
{
    if(Wedding::find($id) === false)
       return Redirect::to('/);

    //Edit code
}

public function update($id)
{
    if(Wedding::find($id) === false)
       return Redirect::to('/);

    //Update code
}

public function destroy($id)
{
    if(Wedding::find($id) === false)
       return Redirect::to('/);

    //Destroy code
}
}
  1. DRYif(Wedding::find($id) === false)チェックを RoR コードのようにするにはどうすればよいですか?
  2. の場合、指定されたすべてのメソッドのWedding::find($id) returns actual Wedding dataようにどのように注入できますか? $wedding variable(可能であれば、クラス スコープを使用して何も検索しません。)

どうもありがとう!

Ps。私の RoR スクリプトを理解していない人のために。基本的にこれを行います。

Before any method call on this controller, execute get_wedding method first. 
If get_wedding can't find the wedding in database, let it redirect to homepage.
If get_wedding finds the wedding in database, inject returned value as @wedding variable to all methods so they can make use of it. (e.g destroy method calling @wedding.destroy() directly.)
4

2 に答える 2

2

はい、フィルターがルートに渡されるデータを操作できるようになる前に。例えば:

Route::filter('wedding', function($route, $request) {
    $id = $route->getParameter('id');
    $wedding = Wedding::findOrFail($id); // if no wedding is found, it returns a 404 here
    // Here is where we hit a small road block. You can call
    $route->setParameters(array($wedding));
    // But you just erased any other parameters the route was accepting.
    // So then you start getting *all* the parameters
    $params = $route->getParameters();
    // Then you try to merge your data in somehow, then you set it back, etc.
});

もっと簡単な方法があります!

あなたのコントローラーの構造から、私はそれがリソースコントローラーであると想定しています。次の例を見てください。

Route::model('wedding, 'Wedding'); // varname, model name
Route::resource('wedding', 'WeddingController'); // The first param here matches the first param above.

class WeddingController extends BaseController {
    ...
    public function show(Wedding $wedding) {
        return View::make('wedding')->with('wedding', $wedding);
    }
    ...
}

これは Route-Model バインディングと呼ばれます。詳細については、http://laravel.com/docs/routing#route-model-bindingを参照してください。

編集

この例を拡張してみましょう。ある日、の/wedding/cahill-manley代わりに のような URL が必要になったとします。この行/wedding/123を削除してRoute::model、その場所に次を追加できます。

Route::bind('wedding', function($value) {
    return Wedding::where('slug', $value)->firstOrFail();
});

そして、物事は働き続けます。

于 2013-07-03T21:52:01.493 に答える