Обычный поток, который обрабатывает это, работает следующим образом:
#users_controller.rb
def new
@user = User.new
end
def create
begin
@user = User.create!(params[:user])
rescue ActiveRecord::RecordInvalid => e
flash[:error] = e.record.errors.full_messages.to_sentence
render :action => "new"
end
end
затем
#views/users/new.html.erb
<%= form_for(@user, :url => user_registration_path, :method=>'post', :id => 'user_new') do |f| %>
<%= f.label :password %>
<%= f.password_field %>
<%= f.text_field :email %>
# etc...
<% end %>
Разница здесь заключается в использовании form_for
, который принимает запись, и использовании немного отличающегосяf.text_field :email
вместо text_field_tag
помощников, которые автоматически устанавливают значение поля @user.email
.Есть немного другое количество параметров, так как вам не нужно указывать этим помощникам, каким должно быть значение поля, поэтому проверьте документы на них.
Когда выполняется проверка, так как вызывается рендери не перенаправлять, недопустимый объект @user
все еще заполняется первоначально отправленными значениями, следовательно, вставляя их в поле.
Я не совсем уверен, что devise делает во внутренних органах, но такого родаподход наилучшей практики должен направить вас в правильном направлении.
Не очень чистая альтернатива - установить значения в поле из хэша params следующим образом: <%= text_field_tag('user[email]', (params[:user] ? params[:user][:email] : nil), :id => 'user-email', :maxlength => 150 %>
.Этот метод также предполагает, что рендеринг, а не перенаправление, происходит, когда публикуется недопустимая форма (или что параметры перенаправляются снова в перенаправлении).