Rails - при отправке формы, затем снова увидеть форму с ошибками -Как сохранить значения? - PullRequest
2 голосов
/ 10 ноября 2010

Когда пользователь регистрируется, если возникает ошибка, после отправки страница обновляется, и вы видите сообщение об ошибке, почему форма не была отправлена ​​в БД.

Но в этой форме значения из формы orig пропали, но они, похоже, находятся в памяти, потому что если вы нажмете обновить, вы можете повторно отправить, так что значения есть.

Почему рельсы не показывают ранее введенные значения, позволяя пользователю обновить повторную отправку?

Моя форма для разработки new.html.erb

    <%= form_tag(user_registration_path, :method=>'post', :id => 'user_new') do |f| %>
.
.

        <tr>
            <td class="label">
                <%= label_tag 'password', 'Password:', :id => 'lpassword', :for => 'password' %>
            </td>
            <td class="field">
                <%= password_field_tag 'user[password]', nil, :id => 'user[password]', :maxlength => 50 %>
            </td>
            <td class="status"></td>
        </tr>

        <tr>
            <td class="label">
                <%= label_tag 'user[email]', 'Email Address:', :id => 'luser[email]', :for => 'user[email]' %>
            </td>
            <td class="field">
                <%= text_field_tag 'user[email]', nil, :id => 'user[email]', :maxlength => 150 %>
            </td>
            <td class="status"></td>
        </tr>
        <tr>
            <td class="label"><label id="lsignupsubmit" for="signupsubmit"> </label></td>
            <td class="field" colspan="2">
                <input id="signupsubmit" name="signup" type="submit" value="Sign Up" />
            </td>
        </tr>
    </table>

    <% end %>

1 Ответ

2 голосов
/ 10 ноября 2010

Обычный поток, который обрабатывает это, работает следующим образом:

#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 %>.Этот метод также предполагает, что рендеринг, а не перенаправление, происходит, когда публикуется недопустимая форма (или что параметры перенаправляются снова в перенаправлении).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...