Laravel 4 - несколько форм на одной странице?

У меня странное поведение с моими формами в Laravel 4. У меня есть страница «настроек» с двумя формами, каждая из которых (должна) выполнять POST в метод контроллера, обновлять базу данных и возвращаться на страницу настроек. Однако, похоже, проблема связана либо с тем, как работают мои формы, либо с моими маршрутами.

Вот как это в упрощенном виде:

Страница настроек: (site.com/settings)

<div id="form-one" class="form-area">

{{ Form::open(array('action' => 'SettingController@editOption')) }}
   {{ Form::text('optionvalue', 'Default')) }}
   {{ Form::submit('Save Changes') }}
{{ Form::close() }}

</div>

<div id="form-two" class="form-area">

{{ Form::open(array('action' => 'SettingController@editPage')) }}
   {{ Form::text('pagevalue', 'Default')) }}
   {{ Form::submit('Save Changes') }}
{{ Form::close() }}

</div>

Итак, по сути, две отдельные формы на одной странице, которые отправляют два отдельных метода в один и тот же контроллер - когда метод успешен, он перенаправляет их обратно в «настройки». Я не буду публиковать методы, поскольку они протестированы и работают, я считаю, что проблема в файле маршрутов:

routes.php

// Checks if a session is active
Route::group(array('before' => 'require_login'), function()
{   
    Route::group(array('prefix' => 'settings'), function()
    {
        Route::get('/', 'SettingController@index');
        Route::post('/', 'SettingController@editOption');
        Route::post('/', 'SettingController@editPage');

    });
});

Теперь я почти уверен, что ему не нравятся два таких маршрута POST, однако я не могу придумать другого способа сделать это, поскольку формы находятся на одной странице. Я получаю сообщение об ошибке:

Unknown action [SettingController@editOption].

Поскольку форма опциона на первом месте, я думаю. Если я беру код лезвия открытой формы (для обоих), он загружает страницу, но, очевидно, форма ничего не делает.

Любая помощь была бы хороша! Заранее спасибо.


person Alias    schedule 27.06.2013    source источник


Ответы (2)


Вы не можете добавить два одинаковых маршрута для разных действий, потому что они будут переданы на первый согласованный маршрут, а в вашем случае - на SettingController@editOption. Измените свои маршруты на:

    Route::post('/option', 'SettingController@editOption');
    Route::post('/page', 'SettingController@editPage');

Тогда в обоих действиях вы можете перенаправить на '/': return Redirect::back(), и если произошла ошибка:

if ($validation->fails())
{
    return Redirect::to('/settings')->with_errors($validation);
}
person oroshnivskyy    schedule 27.06.2013

Мое альтернативное решение для этого - создать скрытый ввод html в каждой форме и заставить контроллер определять, для чего отправлено, на основе этого поля. Итак, вы можете использовать только один маршрут для обоих.

person brunohdaniel    schedule 17.02.2017