ruby-on-rails - 如何获取使用无效数据提交的 Rails 表单以重新填充用户输入的字段

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

我正在努力构建一个 Rails 3 + 设计用户注册页面。这将是一个附加页面,不会替换现有的设备注册页面。此页面将包含用户信息和帐单信息。
我试图让表单提交,如果表单字段没有保存,重新加载的页面包含用户以前输入的数据。这是一个片段:

<%= form_for(User.new, :url => '/pricing/sign_up') do |f| %>
    <%= f.label :email %>
    <%= f.email_field :email %>
<% end %>
当表单提交无效数据时。当 View 重新呈现时,输入的现有电子邮件不会保留。如何让现有用户的输入持久化以帮助用户快速更正错误并提交有效表单?

最佳答案

关键是要有form_for使用正确的对象。所以,而不是

<%= form_for(User.new, :url => '/pricing/sign_up') do |f| %>

你应该使用一个实例变量来包含对象,像这样
<%= form_for(@user, :url => '/pricing/sign_up') do |f| %>

Controller Action 如下所示:
# Note: this may need to be an `edit` method instead?
def new
  @user = User.new
end

# Note: this may need to be an `update` method instead?
def create
  @user = User.new(params[:user])
  if @user.save
    # Do something... Usually a redirect with success message.
  else
    render :new
  end
end

这个 create 方法正在做的是填充 @user带有表单参数的对象。然后调用 @user.save将在幕后调用 @user.valid?并且,如果没有返回错误,则记录被保存到数据库中。但这部分是关键。如 @user.valid?确实会导致错误,然后是 @user 上的错误集合将被填充。然后,在 render :new 之后完成并重新呈现您的用户表单,该表单将能够通过访问 @user.errors 来吐出错误消息。收藏。否则,按照你以前的方式,你总是有一个 User.new永远不会有任何错误的表单中的对象,因为它以前从未用于尝试记录验证。

如何在表单中显示错误是一个偏好问题,有点超出了这个问题的范围。这是一个指南:http://guides.rubyonrails.org/active_record_validations.html#displaying-validation-errors-in-views

关于ruby-on-rails - 如何获取使用无效数据提交的 Rails 表单以重新填充用户输入的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18562935/

相关文章:

ruby-on-rails - 用纯 Ruby 编写 Rails 模板

ruby-on-rails - 如何确保模型始终使用事务和锁(在 Rails 中)?

ruby-on-rails - Gem::LoadError:为数据库适配器指定了 'postgresql',但未加载 gem

javascript - 如何使用 Javascript 并显示新的 Ruby on Rails 应用程序的结果

ruby-on-rails - rails 路由: Treating hardcoded path as a parameter?

ruby-on-rails-3 - Ckeditor 在根 URI 中搜索资源,而其应用程序位于子 URI 上

ruby-on-rails-3 - 在 rails 3.0 中配置 Webrick 以提供 http 和 https (SSL)

ruby-on-rails - Rails 设计 gem 和模态窗口

ruby-on-rails - rails 3 + 设计 : how change a flash message NOT in locale file?

javascript - RSpec、 capybara 、bootbox.js、Rails-3.2。 :selenium driver 的奇怪行为