如果控制器拒绝无效数据,如何在我的视图中保留无效数据?

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 审核拒绝

CodeIgniter:提交无效表单后如何保留值?

Sqldeveloper 无法连接 Oracle 数据库(ORA-01017,用户名/密码无效;登录被拒绝)

Shiro 中的并发会话控制

如何修复“无效的记住我令牌(系列/令牌)不匹配”错误?

一个视图中的 MVC 枚举和模型 - 错误:“是一种类型,在给定的上下文中无效”