我面临的问题很可能与强参数有关。问题是,当我尝试编辑某些用户信息并对其进行更新时,会出现与此表单无关的错误。这种错误应该只在注册或登录时弹出。
例如,这是我的数据库。然后点击“编辑”。
编辑完一些信息并提交后,会弹出错误。
控制器/ users_controller.rb
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
session[:user_id] = @user.id
redirect_to [@user, @task], notice: "Thank you for signing up!"
else
render "new"
end
end
def index
@users = User.all
end
def show
@user = User.find(params[:id])
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
if @user.update(user_params)
redirect_to @user
else
render 'edit'
end
end
def destroy
@user = User.find(params[:id])
@user.destroy
respond_to {|format| format.js }
end
private
def user_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation)
end
end
视图/用户/ edit.html
<h1>Editing user</h1>
<%= form_for :user, url: @user, method: :patch do |f| %>
<% if @user.errors.any? %>
<div id="error_explanation">
<h2>
<%= pluralize(@user.errors.count, "error") %> prohibited
this task from being saved:
</h2>
<ul>
<% @user.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<p>
<%= f.label :first_name %><br>
<%= f.text_field :first_name %>
</p>
<p>
<%= f.label :last_name %><br>
<%= f.text_field :last_name %>
</p>
<p>
<%= f.submit %>
</p>
<%= link_to 'Back to List', users_path %>
<% end %>
模型/ user.rb
class User < ActiveRecord::Base
has_secure_password
EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :first_name, presence: true,
length: {maximum: 20}
validates :last_name, presence: true,
length: {maximum: 40}
validates :email, presence: true,
format: {with: EMAIL_REGEX},
uniqueness: {case_sensitive: false}
validates :password,
length: {within: 6..40}
has_many :tasks
end
我该怎么办?有人可以帮忙吗?
答案 0 :(得分:2)
strong params
的问题是 不 。这是由于password
上的 验证 。
此
validates :password,length: {within: 6..40}
应该是
validates :password,length: {within: 6..40}, on: :create
答案 1 :(得分:1)
是的,问题在于强烈的障碍。您永远不应该允许expr substr 'abacaba' 3 6
和password
password_confirmation
只需从def user_params
params.require(:user).permit(:first_name, :last_name, :email)
end
移除password
和password_confirmation
即可。你不想大规模分配那些价值。
在数据库中存储普通密码是一种非常糟糕的做法。您应该在数据库中存储加密或散列密码;它可以增强应用程序的安全性和完整性。