ruby-on-rails - 在表单中发生错误后,如何获取在Rails中输入的值以保留在表单中?

标签 ruby-on-rails forms error-handling model ruby-on-rails-5

我正在使用Rails5。我有一个包含以下字段的表单

<%= form_for(@user) do |f| %>
  ...
  <div class="profileField">
    <%= f.label :first_name %><br/>
    <div class="field"><%= f.text_field :first_name, :size => 20, :class => 'textField', :tabIndex => '1' %></div>
  </div>
  ...

  <div class="profileField">
    Birthday <% if !@user.errors[:dob].empty? %><span class="profileError"> <%= @user.errors[:dob].join(', ') %></span><% end %> <br/> 
    <div class="field">
      <%= f.text_field :dob_string, :value => f.object.dob_string , :size => "20", :class => 'textField', placeholder: 'MM/DD/YYYY', :tabIndex => 1 %>
    </div>  
  </div>

表单提交后,它将在我的 Controller 中调用此逻辑
  def update
    @user = current_user 
    @user.dob_string = user_params[:dob_string] 
    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

    @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

我的问题是,如果我的表单中有错误,如何在提交表单之前保留某人输入的原始值,而不是之前保存的值?现在,如果发生错误,则用户之前输入的所有值都将替换为之前保存的值。

编辑:

该解决方案无效。我有一个“dob”字段(这是PostGres DATE列),并且我输入了一个无效值(例如“1234”)并单击“保存”,所有保存的内容都不会引发错误。下面是我的用户模型。我还在 View 中添加了日期字段的定义。
class User < ActiveRecord::Base
  has_many :assignments
  has_many :roles, through: :assignments
  belongs_to :address, :autosave => true  #, dependent: :destroy 

  accepts_nested_attributes_for :address

  attr_accessor :dob_string 

  def dob_string
    @dob_string || (self.dob ? self.dob.strftime('%m/%d/%Y') : "")  
  end

  def dob_string=(dob_s)
    date = dob_s && !dob_s.empty? ? Date.strptime(dob_s, '%m/%d/%Y') : nil 
    self.dob = date
  rescue ArgumentError
    errors.add(:dob, 'The birth date is not in the correct format (MM/DD/YYYY)')
    @dob_string = dob_s
  end

  def role?(role)
    roles.any? { |r| r.name.underscore.to_sym == role.to_s.underscore.to_sym }
  end

  def admin?
    role? "Admin"
  end

  def name
    name = first_name 
    if !first_name.nil?
      name = "#{name} "
    end
    "#{name}#{last_name}" 
  end

最佳答案

如果您将属性加载到用户中的方式略有不同,则会自动发生。通常的做法是这样的:

def update
  @user = User.new(user_params)
  if @user.save
     # do stuff for when it saves correctly
  else
     # re-display the edit page with render :edit

注意:如果有错误,保存将返回false,因此您无需与此分开检查错误

但是我看到您只允许他们更新当前用户...(很好)。在这种情况下,您需要:
def update
  @user = current_user
  # applies the attributes without saving to db
  @user.assign_attributes(user_params)
  if @user.save
     # do stuff for when it saves correctly
  else
     # re-display the edit page with render :edit

进行这两种操作都将允许@user对象接收用户输入的属性-然后将其传递给form并显示。

注意:这假设您在 View 中使用了类似form_for @user的代码(您未包含该代码段)

关于ruby-on-rails - 在表单中发生错误后,如何获取在Rails中输入的值以保留在表单中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42357820/

相关文章:

mysql - Rails MySQL 主/从将读取和写入发送到主服务器

html - 如何使CSS搜索表单响应式

python - 在追加文件时,数据没有写入文件,而在读取文件时,它在 python 中显示空字节

ruby:在引发中断之前完成循环迭代

python - 如何在Azure Python Function中挂接到Azure TableService响应?

javascript - 获取传递给 getElementById() 的空字符串。在火狐中

ruby-on-rails - rails : best practice to do versioning of content on mongo db (mongoid)?

ruby-on-rails - 在 Rails 项目中自定义 Responders 应该放在哪里?

javascript - 使用 javascript 在输入字段上只接受 20 的倍数(例如 40、60、80)?

php - HTML 表单完成两个 Action ?验证然后通过一个提交按钮重定向