我使用Rails 5.我有一個像下面如何獲取在我的Rails中輸入的值,以便在表單中發生錯誤後保留表單?
<%= 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 [email protected][: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>
當表單提交的字段的表單,它會調用這個邏輯在我的控制器
def update
@user = current_user
@user.dob_string = user_params[:dob_string]
if [email protected]? && @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 = [email protected]? && [email protected]? ? @user.address.country : Country.cached_find_by_iso('US')
@states = @country_selected.states.sort_by {|obj| obj.name}
render 'edit'
end
我的問題是,如果有在我的表單中是一個錯誤,我如何獲得某人在提交表單之前輸入的原始值,而不是先前保存的值?現在,如果發生錯誤,用戶以前輸入的所有值將被以前保存的內容替換。
編輯:
該解決方案沒有奏效。我有一個「dob」字段(這是PostGres DATE列),而hwen我輸入了一個無效值(例如「1234」)並單擊了「Save」,保存了所有內容而沒有引發錯誤。以下是我的用戶模型。我還在我的視圖中添加了我的日期字段的定義。
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
從你的代碼中,如果有錯誤,'@ user'應該還是有值的用戶提交。如果'@ user.errors.any?'爲true並且它不能到達'@ user.update_attributes'位,那麼'@ user'將具有舊值的唯一方法是 – jvnill