【问题标题】:How render form with previously entered data when validation fails验证失败时如何使用先前输入的数据呈现表单
【发布时间】:2025-12-22 13:45:10
【问题描述】:

我正在做 www.theodinproject.com Project: Forms。如果新用户验证失败,它应该render :new 使用之前输入的数据。我的代码用于保存新用户,当验证失败时它render :new,但之前输入的数据丢失了。

尝试自己研究解决方案,但无法解决。如果发布了类似的问题,我深表歉意。

我的路线

Rails.application.routes.draw do
  resources :users, only: [:new, :create]
end

我的用户控制器

class UsersController < ApplicationController

  def new
    @user = User.new
  end

  def create
    # @user = User.new(username: params[:username], email: params[:email], password: params[:password])
    @user = User.new(user_params)
    if @user.save
      redirect_to new_user_path
    else
      render :new
    end
  end

  private

  def user_params
    params.require(:user).permit(:username, :email, :password)
  end

end

还有我的 new.html.erb

<form accept-charset="UTF-8" action="/users" method="post">
  <input type="hidden" name="authenticity_token" value="<%= form_authenticity_token %>">
  <label for="user[username]">Username:</label>
  <input type="text" name="user[username]"><br>
  <label for="user[email]">email:</label>
  <input type="text" name="user[email]"><br>
  <label for="user[password]">password:</label>
  <input type="password" name="user[password]"><br>
  <input type="submit" value="Submit">
</form>

【问题讨论】:

    标签: ruby-on-rails ruby forms parameters render


    【解决方案1】:

    您永远不会设置输入的值。我建议你使用 Rails 的表单助手,比如 form_for 和其他的。 https://guides.rubyonrails.org/form_helpers.html#binding-a-form-to-an-object

    <%= form_for @user do |f| %>
      <%= label :username %>
      <%= text_field :username %>
      <%= label :email %>
      <%= text_field :email %>
      <%= label :password %>
      <%= password_field :password %>
      <%= submit %>
    <% end %>
    

    编辑:您链接的教程中甚至有一节告诉您使用 form_for :S

    【讨论】:

    • 感谢@arieljuod 的输入。我知道,在本教程的后面,它告诉我使用 rails form helper form_for。让我感到困惑的是,教程建议render :new 应该在form_for 部分之前显示先前输入的数据。这可能是教程的错误提示吗?
    • 我猜这是教程中的错误。你可以不使用form_for 手动设置值,比如&lt;input type="text" name="user[username]" value="&lt;%= @user.username %&gt;"&gt;
    • @quilmes odin 项目让您可以手动完成这个工作,以更好地了解 rails 表单助手的作用,因此事情变得不那么神奇,并且更容易理解。我鼓励您使用刚刚描述的 aireljuod 方法在没有 form_for 助手的情况下再试一次。祝你好运!如果您遇到困难,也可以查看其他学生的解决方案。