2017-02-21 66 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 

Мой вопрос, если есть является ошибкой в ​​моей форме, как я могу получить исходные значения, которые кто-то ввел, прежде чем отправлять форму, чтобы оставаться вместо значений, которые ранее были сохранены? Прямо сейчас, если возникает ошибка, все значения, введенные ранее пользователем, заменяются тем, что было сохранено ранее.

Edit:

Решение не работает. У меня есть поле «dob» (это столбец DATE PostGres), и hwen я ввел недопустимое значение (например, «1234») и нажал «Сохранить», все было сохранено без ошибки. Ниже приведена моя модель пользователя. Я также добавил определение моего поля даты в моем представлении.

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' будет иметь старые значения, - это если' @ user.errors.any? 'является истинным, и он не достигает бит '@ user.update_attributes' – 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 

Примечание: сохранение возвращает ложь, если есть ошибки, так что вам не нужно проверять ошибки отдельно от этого

Но я вижу тебя» повторно разрешая им обновлять текущего пользователя ... (что хорошо). в этом случае вы хотите:

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] », вы действительно имеете в виду« если @ user.save »? Строки непосредственно после этого - это то, что должно быть выполнено, когда все будет успешным. – Dave

+0

Привет, Даже переключение логики на то, что я написал выше, все еще приводит к проблемам, которые я включил в редактирование на мой вопрос. – Dave

+0

Dave. Я не (и не могу) проверить код, который пишу ... Я также не пишу буквально, что вы должны вводить на свой экран ... то, что я пишу в ответ, является решением проблемы. .. это зависит от вас, чтобы он фактически работал на 100%. например, я сознательно не включал поле dob, потому что понял, что вы поняли, что было очевидно, что вы должны продолжать включать его в свой код, и он просто скрыл код, который я пытался написать, чтобы показать вам решение. Да, вы должны добавить свой код dob к решению, которое я дал вам, чтобы он действительно полностью работал на вас. –