Rails - 提交表单时,再次看错表单 - 如何保留值?

时间:2010-11-10 05:39:29

标签: ruby-on-rails ruby-on-rails-3 devise

当用户注册时,如果出现错误,则在提交页面刷新后,您会看到有关表单未提交给数据库的原因的错误消息。

但是在这种形式下,来自原始形式的值已经消失,但它们似乎在内存中,因为如果单击刷新可以重新提交,那么值就在那里。

为什么rails不显示先前输入的值,允许用户更新重新提交?

我的设计形式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 个答案:

答案 0 :(得分:2)

处理此问题的常用流程如下:

#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对象仍然填充了最初发布的值,因此将它们插入到字段中。

我不完全确定它的内部构造有什么设计,但是这种最佳实践方法应该以正确的方式发送给你。

一个不那么干净的替代方案是从params哈希中设置字段中的值,如下所示: <%= text_field_tag('user[email]', (params[:user] ? params[:user][:email] : nil), :id => 'user-email', :maxlength => 150 %>。此方法还假定在发布无效表单时发生渲染,而不是重定向(或者在重定向中再次发送参数)。