无法创建编辑表单并保存到数据库

时间:2013-06-10 07:21:43

标签: laravel laravel-4

我正在尝试编辑数据库中的一行。我尝试加载编辑表单及其中的内容,如下所示,但我似乎得到一个错误:“缺少一些必需参数(”匹配“)以生成路由”matches.update“的URL。”

@extends('master')
    @section('content')
        <h1>Compare Ages</h1>   

        {{ Form::open(array('action' => 'MatchesController@update')) }}


            {{ Form::label('n1label', 'Person 1: ') }}
            {{ Form::text('name1', $match->name1) }}<br/>
            {{ Form::label('v1label', 'Age: ') }}
            {{ Form::text('val1', $match->val1) }}<br/><br/>

            {{ Form::label('n2label', 'Person 2: ') }}
            {{ Form::text('name2', $match->name2) }}<br/>
            {{ Form::label('v2label', 'Age: ') }}
            {{ Form::text('val2', $match->val2) }}<br/><br/>

        {{ Form::submit('Update Pair') }}

        {{ Form::close() }}

    @stop

这是我在控制器上进行编辑和更新的方法:

public function edit($id)
{
    print_r(Mydata::find($id));
    return View::make('matches.edit')

        ->with('title', 'Edit Match')
        ->with('match', Mydata::find($id));

}

public function update($id)
{

    $input = Mydata::where('id', Mydata::find($id));
    $new_input = array(
        'name1'=>Input::get('name1'),
        'val1'=>Input::get('val1'),
        'name2'=>Input::get('name2'),
        'val2'=>Input::get('val2')
        );
    $input->update($new_input);


    return Redirect::to('matches')
    ->with('message', 'Match updated successfully!');

}

请让我知道如何在匹配/编辑表单上加载内容并在使用路由匹配/更新进行编辑后保存,然后重定向到匹配/ $ id和更新的数据

3 个答案:

答案 0 :(得分:3)

我认为这与您需要ID的功能有关。我想你需要在表格公开电话中加入正在更新的项目的ID。

我不确定你需要的语法,也许就像泰勒在这里提到的那样:https://github.com/laravel/framework/issues/844#issuecomment-15996265

或他们在这里说的话:Laravel 4: What to pass as parameters to the Url class?。 (这当然是URL类,但我想它对于Form类来说类似)

编辑:

好的,这是Form的'getControllerAction'函数中的代码,如果使用'action'参数,则由Form :: open调用。

/**
 * Get the action for an "action" option.
 *
 * @param  array|string  $options
 * @return string
 */
protected function getControllerAction($options)
{
    if (is_array($options))
    {
        return $this->url->action($options[0], array_slice($options, 1));
    }

    return $this->url->action($options);
}

所以看起来它只是为控制器动作抓取传递数组的第一个元素,然后将其余部分用作选项。因此,您应该能够去:

{{ Form::open(array('action' => 'MatchesController@update', 'id' => $match->id)) }}
祝你好运:)

答案 1 :(得分:1)

稍微调整一下:如果你改变了

{{ Form::open(array('route' => array('matches.update', $match->id), 'method' => 'PUT')) }}

{{ Form::model($match, array('route' => array('matches.update', $match->id), 'method' => 'PUT')) }}

Laravel将填充表单上的现有字段;对于需要编辑的表单来说非常方便。注意使用 Form :: model 传递参数 $ match

答案 2 :(得分:0)

我能够通过以下方式更改我的代码来查看表单,编辑,提交和更改数据库:在edit.blade.php表单中:

{{ Form::open(array('route' => array('matches.update', $match->id), 'method' => 'PUT')) }}

在MatchesController.php控制器上:

public function update($id)
{
    $input = Mydata::find($id);
    $input->update(array(
        'name1'=>Input::get('name1'),
        'val1'=>Input::get('val1'),
        'name2'=>Input::get('name2'),
        'val2'=>Input::get('val2'),
        'updated_at'=>new DateTime
        ));
    $input->save();

    return Redirect::to('matches/'.$id)
    ->with('message', 'Match updated successfully!');

}

最后,正如您所看到的,我可以重定向到节目视图。谢谢你,约翰!