我正在使用Rails 4.2.7。我有一个带有日期属性的模型(名为“dob”,whicih映射到类型为“date”的PostGres表列)。我在页面上有以下文本输入,允许用户输入此信息
<%= 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 %>
在控制器端,我有处理输入的逻辑
def update
@user = current_user
begin
@user.dob = Date.strptime(params[:user][:dob], '%m/%d/%Y')
rescue ArgumentError => ex
@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
else
@country_selected = !@user.address.nil? && !@user.address.country.nil? ? @user.address.country : Country.cached_find_by_iso('US')
@states = @country_selected.states.sort_by {|obj| obj.name}
render 'edit'
end
end
然而,问题是,当有人输入无效输入时(例如“01-02 / 2012”,他们会返回到页面,但他们输入的数据不再存在。如何保存他们输入的错误数据在视图中?
答案 0 :(得分:1)
else
@country_selected = !@user.address.nil? &&
...
@user.dob = params[:user][:dob]
因为它只是一个文本字段,我认为这应该有用。 但是,有几个问题:您是否通过ajax提交表单?如果没有,请考虑这样做。如何在代码的前端验证日期?您至少应该努力从Rails控制器中取出验证并将其放入User模型中。它被认为是&#39; Rails方式&#39;将验证逻辑移动到模型,而不是控制器http://guides.rubyonrails.org/active_record_validations.html