如果控制器拒绝无效数据,如何在我的视图中保留无效数据?
Posted
技术标签:
【中文标题】如果控制器拒绝无效数据,如何在我的视图中保留无效数据?【英文标题】:How do I preserve invalid data in my view if the controller rejects it? 【发布时间】:2016-12-29 22:08:13 【问题描述】:我使用的是 Rails 4.2.7。我有一个带有日期属性的模型(名为“dob”,它映射到类型为“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”,他们返回到页面但他们输入的数据不再存在。我如何保留他们输入的错误数据在视图中?
【问题讨论】:
【参考方案1】: else
@country_selected = !@user.address.nil? &&
...
@user.dob = params[:user][:dob]
由于它只是一个文本字段,我认为这应该可以。 但是,有几个问题:您是通过 ajax 提交表单吗?如果没有,请考虑这样做。以及如何验证代码前端的日期?您至少应该努力从 Rails 控制器中取出验证并将其放入 User 模型中。将验证逻辑移动到模型而不是控制器 http://guides.rubyonrails.org/active_record_validations.html
被认为是“Rails 方式”【讨论】:
不,我不通过 AJAX 提交。我可以更改为“Rails 方式”并添加您所说的验证规则,只需让我知道这些是什么以及等效的控制器代码应该是什么。 无论如何,添加 "@user.dob = params[:user][:dob]" 无论如何都不起作用(视图中的结果文本字段为空白)。以上是关于如果控制器拒绝无效数据,如何在我的视图中保留无效数据?的主要内容,如果未能解决你的问题,请参考以下文章
由于无效原因,我的应用被 Instagram Basic Display API 审核拒绝