gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:50:28 25 4
gpt4 key购买 nike

我正在使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com