2017-02-21 36 views
0

我使用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 
+0

從你的代碼中,如果有錯誤,'@ user'應該還是有值的用戶提交。如果'@ user.errors.any?'爲true並且它不能到達'@ user.update_attributes'位,那麼'@ user'將具有舊值的唯一方法是 – jvnill

回答

0

如果將屬性加載到用戶中的方式稍有不同,則會自動發生。通常的方式做到這一點的東西更是這樣的:

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和顯示。

注:這裏假設你正在使用類似form_for @user在您的視圖(你不包括片段)

+1

當您說「if [email protected] 「,你的意思是」if @ user.save「嗎?緊隨其後的是當事情成功時應該執行的內容。 – Dave

+0

嗨,即使切換到我上面寫的邏輯仍然會導致問題,這些問題包括在我的問題的編輯中。 – Dave

+0

Dave。我沒有(也不能)測試我寫的代碼......我也不會直接寫出你應該輸入到屏幕上的內容......我在答案中寫的是解決當前錯誤的方法。 ..然後由你​​來讓它實際上工作100%。例如,我故意沒有包含dob字段,因爲我認爲很明顯,您應該繼續將其包含在您的代碼中,並且它只是掩蓋了我試圖編寫的代碼以向您顯示解決方案。是的,您應該將您的dob代碼添加到我給您的解決方案中,以使其完全適合您。 –

相關問題