如果之前有人问过我,我很抱歉,但我找不到答案。
我最近创建了一个用于验证日期的date_regex验证方法
VALID_DATE_REGEX = /\d{2}[\/]\d{2}[\/]\d{4}/
我知道正则表达式现在不好,我稍后会更新,但我不需要任何帮助。
我添加了一个允许用户选择生日的字段。我不得不更新我的用户模型以允许这样的功能。
迁移文件
class AddAgeToUsers < ActiveRecord::Migration
def change
add_column :users, :age, :integer
add_column :users, :birthday, :date
add_column :users, :location, :string
end
end
这是我在Users.rb中的验证
validates :birthday, format: { with: VALID_DATE_REGEX }, :on => :update
试图找出问题所在,我启动了Rails控制台
u = User.find(1)
u.update_attributes(:birthday => '12/22/1992')
=> u.save (false)
u.errors.full_messages
=> Birthday is invalid
u.birthday
=> nil
看起来问题是我预计生日的价值是'12 / 22/1992'但是它是零。
我发现这就是为什么记录没有在数据库中更新的原因。我不知道将属性存储为日期是否存在问题,但它不起作用。
用户控制器
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
redirect_to @user
flash[:success] = "Your profile has been updated"
else
render 'edit'
end
end
用户编辑页面
<% @title = "Edit Profile" %>
<h2>Update your information here</h2>
<div class = "center">
<%= form_for @user do |f| %>
<p>
<%= f.label :name, 'Username', class: 'marker' %>
<%= f.text_field :name %>
</p>
<p>
<%= f.label :email, class: 'marker' %>
<%= f.text_field :email %>
</p>
<p>
<%= f.label :birthday, class: 'marker' %>
<%= f.text_field :birthday %>
</p>
<p>
<%= f.label :location, class: 'marker' %>
<%= f.text_field :location %>
</p>
<p>
<input class="btn btn-primary" type="submit" value="Update">
</p>
<% end %>
</div>
非常感谢帮助。
更新
我将birthday属性更改为字符串类型。现在,当我在控制台中运行update_attributes(:birthday)时,它会保存,但是当我在文本框中输入相同的内容时,它就不会保存。
我无法弄清楚这一点。
答案 0 :(得分:2)
您正在尝试将字符串另存为日期对象。
u.update_attributes(:birthday => DateTime.strptime("12/22/1992", "%m/%d/%Y")
应该工作,因为它将返回一个Date对象,然后可以将其保存到数据库中
编辑:正如已经提到的那样
u.update_attribute(:birthday, DateTime.strptime("12/22/1992", "%m/%d/%Y")
update_attribute(sans's')接受参数(名称,值)。此外,这将跳过验证。
u.update_attributes(:birthday => DateTime.strptime("12/22/1992", "%m/%d/%Y")
update_attributes接受hash参数。此外,这不会跳过验证。
答案 1 :(得分:1)
您在string
传递了u.update_attribute(:birthday => '12/22/1992')
,而不是date
。这是:update
失败的原因。检查#strptime并找到符合您需求的格式。
尝试u.update_attributes(:birthday, Date.strptime("12/22/1992", "%m/%d%Y"))
。
UPD
要使其正确保存(正如您在评论中所述),请尝试
u.update_attributes(:birthday, Date.strptime("12/22/1992", "%Y-%m-%d"))
答案 2 :(得分:0)
如前所述,我将生日属性声明为日期字段。如果属性是字符串类型,它会更好。
add_column :users, :birthday, :string
然后我迁移了该文件并使用Rails Console。
u = User.first
u.update_attributes(:birthday => "12-22-1992")
这次正确记录并保存了值。
u.birthday
=> "12-22-1992"
然后我在我的编辑表单中的Rails应用程序中测试了它。
价值仍然无效,我只知道原因。
问题在于我的user_params方法
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation,
:location)
end
我只是将:birthday属性添加到我的users_params中,它解决了我的问题。这次生日成功保存。
感谢大家的帮助。