我有一个用于更新某些属性的编辑表单。但是它试图编辑所有属性,并且导致这个我有验证错误。
我的表单(编辑视图)
#person_info.fl_l
- if @user.errors.any?
.error_explanation
%h2 Form is invalid
%ul
-for message in @user.errors.full_messages
%li= message
=form_for @user do |f|
%p
Birthday:
%br
= f.date_select(:birthday,:start_year => 1940)
%p
Name:
%br
= f.text_field :name, :value=>@user.name
%p
Surname:
%br
= f.text_field :surname, :value=>@user.surname
%p
Nickname:
%br
= f.text_field :nickname, :value=>@user.surname
%p
About Myself:
%br
= f.text_area :about_myself, :value=>@user.about_myself
%p
= f.submit "Update"
我的更新和修改操作:
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
redirect_to @user
else
render 'edit'
end
end
当我提交表单时,它会输出验证错误,例如:“密码不能为空”
那么,如何仅更新部分属性,而不是全部?我不想在我的情况下更新密码。
我的用户模型
class User < ActiveRecord::Base
has_many :posts
has_many :sent_messages, :class_name => "Message", :foreign_key => "sender_id"
has_many :received_messages, :class_name => "Message", :foreign_key => "receiver_id"
attr_accessible :name, :email, :password, :password_confirmation
has_secure_password
email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :name, :presence => true,
:length => {:maximum => 50}
validates :email, :presence => true,
:format => {:with => email_regex},
:uniqueness => {:case_sensitive => false}
validates :password, :presence => true,
:confirmation => true,
:length => {:within => 6..40}
before_create { generate_token(:auth_token) }
def send_password_reset
generate_token(:password_reset_token)
self.password_reset_sent_at = Time.zone.now
save!
UserMailer.password_reset(self).deliver
end
def generate_token(column)
begin
self[column] = SecureRandom.urlsafe_base64
end while User.exists?(column => self[column])
end
end
答案 0 :(得分:1)
从params哈希
中删除它params.delete(:password)
或构建您自己的哈希以发送更新。
答案 1 :(得分:1)
结帐Authentication in Rails 3.1以平滑您的身份验证。它从你的模型中取出了很多代码。
然后,我注意到:如果由于任何原因从表单隐藏字段,则rails不会在params哈希中传递此更新。因此,您可以在表单中隐藏字段。这就是我解决的问题。
答案 2 :(得分:1)
我通过附加
解决了这个问题,:on => :create
到我的validates_presence_of和validates_length_of行。
答案 3 :(得分:0)
我已经在用户密码验证中解决了这个问题,如下所示:
validates :password, :presence => true,
:confirmation => true,
:if => :password # only validate if password changed!
答案 4 :(得分:0)
我相信你的模型在当前状态下无效......你没有输入密码,所以Rails没有触及那个属性。
在rails控制台中,测试:
user = User.find(whatever_the_id_is)
puts user.valid?
puts user.errors.inspect
我的假设是,由于密码丢失,它无效。