2015-09-04 97 views
0

直到這一點我基本上一直在使用資源路由。我的路線之一是項目。如果我創建一個項目,然後表現出來,我看到一個URL中的Laravel 5刀片內的路由

myUrl /項目的形式/ 1

在一個項目展示頁面,我希望能夠增加一個文件。我已經建立了關係,所以一個項目可以有一個文檔和一個文檔屬於一個項目。然後,我設置以下途徑來處理文檔中的數據

Route::post('projects/{id}/docOne', '[email protected]'); 

的節約所以我加入項目/ show.blade.php的一種形式,它打開像這樣

{!! 
    Form::model(new App\DocOne, [ 
     'class'=>'form-horizontal', 
     'route' => ['docOne.store'] 
    ]) 
!!} 

然後我有我的表單域和一個保存數據按鈕。由於我的項目展示頁面中有這種新形式,所以當我現在展示一個項目時,它會抱怨未定義此新窗體的路線。

我怎樣才能讓這條路線在項目展示頁面上工作?

感謝

+1

您是否已將路由名稱定義爲'docOne.store'?就像我看到的那樣,你只定義URL和控制器,但是你永遠不會定義你的路由名。嘗試:'Route :: post('projects/{id}/docOne',array('as'=>'docOne.store','uses'=>'DocOneController @ store'))' –

+0

如果您不想要設置一個路由名稱,您也可以將''route'=> ['docOne.store']'更改爲:''url'=>'projects /'。{{yourId}}。'/ docOne'' ,更好,我發佈我的答案 –

回答

1

首先,你需要定義一個路線名稱路線,如果你想通過自己的名字來稱呼它。 所以,你的路線是這樣的:

Route::post('projects/{id}/docOne', [ //you need an array to set a route name 
    'as' => 'docOne.store', //here define the route name 
    'uses' => '[email protected]' //here the callback 
]); 

其次,你需要改變你的laravel形式使用您的航線名稱,並設置id

{!! Form::model(new App\DocOne, [ 
    'route' => ['docOne.store', $project], //if you have setted the id variable like $id blade it gonna retturn it automatically only by passing the object, else, you can set $project->id 
    'method' => 'POST'] 
) !!} 

編輯:

你可以用」在你的視圖中得到一個模型的實例。 所以部分:

{!! Form::model(new App\DocOne, 

會失敗,每次trye時間,此外,格式:模型需要的是應該把你的瓦爾充滿了信息的輸入,應該有一個類的實例(當你編輯)。

有兩種解決方法:

如果它是一個新的文件,從來沒有在你的數據庫 存在之前我建議改變你的

Form::model 

到:

Form::open 

如果它是一個Doc已經存在於您的數據庫中,就像編輯一樣,所以在您的控制器中,您需要將現有Doc作爲$doc和r安置在:{!! Form::model(new App\DocOne,到:

{!! Form::model($doc, 

它的工作原理。

表單模型的創建是爲了用對象實例中存在的數據填充輸入值,就像編輯someting時一樣。 所以你需要有一個正確的實例。 另一個人認爲這是MVC作用域,視圖不應該對模型具有訪問權限,除非通過控制器傳遞。

好的就是這樣。

+0

謝謝,這似乎已經修復了大多數事情。當我單擊新窗體上的保存時,它現在抱怨類應用程序\ Http \ Controllers \ DocOne不存在,即使它。什麼會導致這種情況?謝謝 –

+1

它的某些我認爲當我發佈我的答案時,這是因爲視圖不應該訪問模型,如果它不傳遞控制器,它是MVC模型範圍的一部分。 解決方案是將'App \ DocOne'替換爲''project',就像我看到你將項目對象傳遞給視圖一樣,所以,你已經有了這個類的對象,我會改變我的答案。 –