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

时间:2016-12-29 22:08:14

标签: ruby-on-rails validation ruby-on-rails-4 view controller

我正在使用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”,他们会返回到页面,但他们输入的数据不再存在。如何保存他们输入的错误数据在视图中?

1 个答案:

答案 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