Ответ Apneadiving является правильным, однако я думаю, что важно уточнить некоторые вещи:
На какую страницу вы пытаетесь попасть пользователю? Похоже, вы хотите, чтобы пользователь попал на страницу индекса (вы удивляетесь, что пользователь попадает на новую страницу).
Во-первых: вы должны понимать взаимосвязь между типом HTTP-запроса и местом, куда контроллер направляет браузер. Смотри http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions
По сути, ваша форма отправляет запрос POST по адресу /users
. Контроллер всегда направляет сообщения по этому адресу в действие CREATE. Таким образом, как объяснил Apneadiving, отправляемые вами пост-параметры - это не те, которых ожидает CREATE, поэтому сохранить не удается, и вы будете перенаправлены на users/new
Теперь я вижу, что в вашей форме вы указали: :controller => 'users', :action => 'index'
. Итак, вот где я вижу, что вы хотите, чтобы люди попадали на главную страницу. Однако вам нужно понять, что помощники форм Rails магически не связаны со слоем контроллера.
Второе: Знайте, что поток информации в Rails в основном односторонний: вещи из модели могут идти к контроллеру, но не другим путем. Вещи из контроллера могут идти в представление, но не в другую сторону.
Единственное, что контроллер может получить от пользователя, - это HTTP-запрос. Когда вы используете помощники тегов формы, вы просто используете ярлык для определения атрибутов action
и method
элемента HTML form
. См http://www.w3.org/TR/html401/interact/forms.html#h-17.13
Итак, даже если вы указали :action => 'index'
, ваша форма все еще отправляет запрос POST (по умолчанию создается POST). Контроллер не знает, что вы имели в виду запрос этого человека на действие index, он знает только то, что он получил POST, а не GET, по адресу /users
. Поэтому он направляет этот запрос к действию CREATE.
Вот что такое REST.
Решение:
Вам нужно использовать действие, которое еще не предопределено. На ваших маршрутах это выглядит так, как будто вы пытались сделать это, когда вы добавили:
resources :users do
member do
post 'login'
end
end
Этот код будет правильно принимать запросы POST к users/123/login
.
Однако, поскольку вы указали это в ЧЛЕНЕ коллекции пользователя, а не в самой КОЛЛЕКЦИИ, вам придется предоставить конкретный USER_ID для правильной обработки этого запроса. Поскольку вы используете это действие для входа в систему, это не то, что вам нужно. См http://guides.rubyonrails.org/routing.html#nested-resources
Вместо этого вам нужно указать этот маршрут для КОЛЛЕКЦИИ (то есть: users/login
):
resources :users do
collection do
post 'login'
end
end
Затем в вашей форме измените тег формы на :controller => 'users', :action => 'login'
.
Наконец, в вашем контроллере вам нужно указать действие входа в систему. В этом случае это может быть так просто:
def login
redirect_to users_path
end
Все, что нужно будет сделать, это получить POST и перенаправить на индекс. Однако, если вы хотите, чтобы параметры из вашей формы были прикреплены, вам нужно обработать их в действии LOGIN. Они не будут сохраняться и будут доступны вашему действию INDEX после перенаправления.
Надеюсь, это прояснит для вас. Удачи!