首页 > 解决方案 > 在 Rails 中加载注册页面时自动填充表单字段

问题描述

我有这个注册表单代码(控制器添加在下面):

<%= form_with(model: @user, class: "shadow p-3 mb-3 bg-info rounded", local: true) do |f|%>
        <div class="form-group row">
            <%= f.label :username, class: "col-2 col-form-label text-light"%>
            <div class="col-10">
            <%= f.text_field :username, class: "form-control shadow rounded", placeholder: "Enter a username" %>
            </div>
        </div>

        <div class="form-group row">
            <%= f.label :email, class: "col-2 col-form-label text-light"%>
            <div class="col-10">
            <%= f.email_field  :email, class: "form-control shadow rounded", placeholder: "Enter your e-mail address"  %>
            </div>
        </div>

        <div class="form-group row">
            <%= f.label :password, class: "col-2 col-form-label text-light"%>
            <div class="col-10">
            <%= f.password_field  :password, class: "form-control shadow rounded", placeholder: "Choose a password"  %>
            </div>
        </div>

        <div class="form-group row justify-content-center">
            <%= f.submit class:"btn btn-outline-light btn-lg" %>
        </div>
    <% end %>

即使我设置了占位符(占位符:“....”),当我加载页面时,它也会自动填充一些个人值 - 电子邮件 + 密码。 在此处输入图像描述

创建用户的控制器代码如下:

class UsersController <ApplicationController

    before_action :set_user, only: [:show, :edit, :update, :destroy]
    before_action :require_user, only: [:edit, :update]
    before_action :require_same_user, only: [:edit, :update, :destroy]

    def show
        @articles = @user.articles.paginate(page: params[:page], per_page: 2)
    end

    def index
        @users = User.paginate(page: params[:page], per_page: 2)
    end

    def new
        @user = User.new
    end


    def edit
    end

    def update
        if @user.update(user_params)
            flash[:notice] = "Your account information was successfully updated."
            redirect_to @user
        else
            render 'edit'
        end

    end


    def create
        @user = User.new(user_params)
        if @user.save
            session[:user_id] = @user.id
            flash[:notice] = "Welcome to the Alpha Blog #{@user.username}, you have successfully signed up."
            redirect_to articles_path
        else
            render 'new'
        end
    end

    def destroy
        @user.destroy
        session[:user_id] = nil if @user == current_user
        flash[:notice] = "Account and all associaed articles successfully deleted."
        redirect_to articles_path
    end


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

    def set_user
        @user = User.find(params[:id])
    end

    def require_same_user
        if current_user != @user && !current_user.admin?
            flash[:alert] = "You can only edit or delete your own profile"
            redirect_to @user
        end
    end
end

不知道如何禁用它。谢谢!

标签: htmlruby-on-railserb

解决方案


form_with(model: @user, ...@user使用变量中的任何内容构建表单。

假设您有这样的用户:

$ @user = User.first
> #<User id: 1, email: "person@email.com", username: "Person", password_digest: [FILTERED]>

在这种情况下,form_with字段将使用表单中的现有记录值。

如果您在此视图的控制器操作中创建了一个新用户:

$ @user = User.new
> #<User id: nil, email: nil, username: nil, password_digest: nil>

那么表单域应该是空白的。

如何测试这是否是问题:

将您的替换@userUser.new

<%= form_with(model: @user, ...

还有什么可能发生: *

  1. 浏览器可以自动填充表单数据,Chrome 经常这样做。
  2. 浏览器扩展程序,如密码管理器,可以自动填充表单数据

推荐阅读