gpt4 book ai didi

ruby-on-rails - 如果我的日期格式在Rails中不正确,如何正确显示验证错误?

转载 作者:行者123 更新时间:2023-12-04 05:44:58 26 4
gpt4 key购买 nike

我正在使用Rails 4.2.7。如果用户未以正确的格式输入出生日期字段,我想抛出一个验证错误,因此我有

  def update
@user = current_user
begin
@user.dob = Date.strptime(params[:user][:dob], '%m/%d/%Y')
rescue ArgumentError => ex
end
if @user.update_attributes(user_params)

我认为这是
      <%= f.text_field :dob, :value => (f.object.dob.strftime('%m/%d/%Y') if f.object.dob), :size => "20", :class => 'textField', placeholder: 'MM/DD/YYYY' %>
<% if @user.errors[:dob] %><%= @user.errors[:dob] %><% end %>

但是,即使输入的日期为“01-01/1985”,上述操作也不会向 View 返回验证错误。我需要怎么做才能使验证错误正确返回?

编辑:根据给出的答案之一,我尝试了
@user = current_user
begin
@user.dob = Date.strptime(params[:user][:dob], '%m/%d/%Y')
rescue ArgumentError => ex
puts "Setting error."
@user.errors.add(:dob, 'The birth date is not in the right format.')
end
if @user.update_attributes(user_params)
last_page_visited = session[:last_page_visited]
if !last_page_visited.nil?
session.delete(:last_page_visited)
else
flash[:success] = "Profile updated"
end
redirect_to !last_page_visited.nil? ? last_page_visited : url_for(:controller => 'races', :action => 'index') and return
else
render 'edit'
end

即使我可以看到调用了“rescue”分支,也不会直接进入我的“render'edit'”块。

最佳答案

调用update_attributes会清除您在rescue中设置的错误。您应该检查是否有错误,如果没有,请继续执行以下操作:

@user = current_user
begin
@user.dob = Date.strptime(params[:user][:dob], '%m/%d/%Y')
rescue ArgumentError => ex
puts "Setting error."
@user.errors.add(:dob, 'The birth date is not in the right format.')
end
if !@user.errors.any? && @user.update_attributes(user_params)
last_page_visited = session[:last_page_visited]
if !last_page_visited.nil?
session.delete(:last_page_visited)
else
flash[:success] = "Profile updated"
end
redirect_to !last_page_visited.nil? ? last_page_visited : url_for(:controller => 'races', :action => 'index') and return
end

render 'edit'

由于您使用 redirect_to ... and return,因此可以关闭条件,并且,如果您已经达到此条件,则只需呈现编辑页面即可。

您可能还想向用户模型添加一个简单的验证:
validates :dob, presence: true

如果由于某些其他无法预见的原因而无法设置Dob,这将始终失败。

要让用户输入字符串以在重新加载时填充字段,您可以为:dob_string添加访问器到用户模型中
attr_accessor :dob_string

def dob_string
dob.to_s
@dob_string || dob.strftime('%m/%d/%Y')
end

def dob_string=(dob_s)
@dob_string = dob_s
date = Date.strptime(dob_s, '%m/%d/%Y')
self.dob = date
rescue ArgumentError
puts "DOB format error"
errors.add(:dob, 'The birth date is not in the correct format')
end

然后更改形式以设置:dob_string
<%= form_for @user do |f| %>
<%= f.text_field :dob_string, :value => f.object.dob_string , :size => "20", :class => 'textField', placeholder: 'MM/DD/YYYY' %>
<% if @user.errors[:dob] %><%= @user.errors[:dob] %><% end %>
<%= f.submit %>
<% end %>

并更新 Controller 以设置dob_string:
def update
@user = User.first
begin
#@user.dob = Date.strptime(params[:user][:dob], '%m/%d/%Y')
@user.dob_string = user_params[:dob_string]
end
if ! @user.errors.any? && @user.update_attributes(user_params)
redirect_to url_for(:controller => 'users', :action => 'show') and return
end
render 'edit'
end

def user_params
params.require(:user).permit(:name, :dob_string)
end

关于ruby-on-rails - 如果我的日期格式在Rails中不正确,如何正确显示验证错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41333932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com