2013-09-14 3 views
0

Я настраиваю базовую аутентификацию/логин для своего приложения и сталкиваюсь с раздражающей, хотя и незначительной проблемой.Если оператор не регистрирует «save» rails 4

Ниже мой «создать» метод:

def create 
    @user = User.new(user_params) 

    if @user.save 
     flash[:notice] = "You signed up successfully" 
     flash[:color]= "valid" 
    else 
     flash[:notice] = "Form is invalid" 
     flash[:color]= "invalid" 
    end 

    render "index" 
end 

После рендеринга индекса я иногда получу форма недействительна, а иногда вы подписались успешно, я буду получать форму недействительна, даже если успешно добавлены данные к дБ.

<% if flash[:notice] %> 
<div class="notice"><%= flash[:notice] %></div> 
+0

Является ли это действие многократно повторяющимся с теми же параметрами? – pdoherty926

+0

нет, однако я заметил, что я отсутствовал def указатель. Может ли это быть фактором? – Melbourne2991

+0

Да, рельсы 4 требуют определения действия, даже если оно пустое. Просто добавьте 'def index' – Santhosh

ответ

0

Причина в том, вы использовали render вместо redirect_to.

flash что-то хранится в сеансе, которое вступит в силу только после следующего запроса.

В вашем контроллере есть только один запрос, вспышка по-прежнему остается старой информацией, сохраненной в сеансе, и render не обновит ее.

Чтобы исправить, заменить render с redirect_to

+0

Теперь работаем с тем, что, когда форма недействительна, данные не вводятся в db. Как я могу узнать, почему форма не может быть сохранена? – Melbourne2991

+0

вы можете перенаправить на индекс, если успех, и 'render 'new'', если не удалось снова отобразить форму с добавленными ошибками. –

0

Есть две вещи.

Первый взгляд, как flash работ. Если вы поместите что-то, он останется там до следующего запроса.

flash[:foo] = 'bar' 
flash[:foo] #=> 'bar' 

# redirect the user or reload of the page 
flash[:foo] #=> 'bar' 

# redirect the user or reload of the page 
flash[:foo] #=> nil 

Для сообщений об ошибках, которые должны быть шоу в том же запросе, но не в следующем, звоните now

flash.now[:foo] = 'bar' 
flash[:foo] #=> 'bar' 

# redirect the user or reload of the page 
flash[:foo] #=> nil 

Дальнейшее чтение: http://edgeguides.rubyonrails.org/action_controller_overview.html#the-flash

Другое дело: Если вы не только обрабатывать запрос на получение данных (но вместо этого создайте, обновите, удалите), пожалуйста, перенаправьте пользователей после успешной операции. Не просто визуализировать другое представление. Причина в том, что если пользователь перезагрузит страницу, браузер будет отклонен последним запросом. И - в вашем случае - попробуйте создать второго пользователя с теми же данными.

tldr: Если save не увенчались успехом, render форму снова. Если save был успешным, redirect пользователю show или index

Смежные вопросы