Редактирование профиля пользователя не работает - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть 2 формы на моей странице настроек пользователя, одна для всех основных настроек и одна для изображения профиля. Каждый раз, когда я пытаюсь обновить фотографию пользователя, я получаю сообщение об ошибке «пароли не могут быть пустыми», даже если поля пароля имеют другую форму.

код для форм:

<%= form_for @user, :html=> { :multipart => true} do |f| %>
  <%= render 'shared/error_messages', :object => f.object %>
 <div class="field">
  <%= f.label :name %><br />
  <%= f.text_field :name %>
 </div>
 <div class="field">
   <%= f.label :email %><br />
   <%= f.text_field :email %>
 </div>
<div class="field">
  <%= f.label :password %><br />
  <%= f.password_field :password %>
</div>
   <div class="field">
     <%= f.label :password_confirmation, "Confirmation" %><br />
   <%= f.password_field :password_confirmation %>
   </div>
  <div class="actions">
      <%= f.submit "Update" %>
  </div>
 <% end %>

  <%= form_for @user, :html=> { :multipart => true} do |f| %>
<%= f.file_field :photo %>
       <br />
     <%= f.submit "Update" %>
  <% end %>

и мой файл user.rb:

class User < ActiveRecord::Base

  attr_accessor :password

  attr_accessible :name, :email, :password, :password_confirmation, :photo

    has_attached_file :photo,
                  :styles => {
                  :thumb=> "50x50#",
                  :small  => "220x220>" },
                  :storage => :s3,
                  :s3_credentials => "#{Rails.root}/config/s3.yml",
                  :path => "/:style/:id/:filename"

has_many :microposts, :dependent => :destroy
has_many :relationships, :foreign_key => "follower_id",
                           :dependent => :destroy
has_many :following, :through => :relationships, :source => :followed
has_many :reverse_relationships, :foreign_key => "followed_id",
                                   :class_name => "Relationship",
                                   :dependent => :destroy
has_many :followers, :through => :reverse_relationships, :source => :follower

   email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

   validates :name,  :presence => true,
                :length   => { :maximum => 50 }
   validates :email, :presence   => true,
                :format     => { :with => email_regex },
                :uniqueness => { :case_sensitive => false }

   validates :password, :presence     => true,
                                       :confirmation => true,
                                       :length       => { :within => 6..40 }

                                        before_save :encrypt_password

Любая помощь очень ценится!

Ответы [ 3 ]

2 голосов
/ 10 февраля 2012

Затем необходимо проверить, не заполнено ли поле пароля, а затем проигнорировать проверку и, если пользователь что-то в нее заполняет, это следует проверить, а если оно создается при создании новой записи, оно должно быть проверено всегда.

Итак, я бы сказал, это должно выглядеть так:

validates :password, :presence     => true,
                                       :if => :validate_password?,
                                       :confirmation => true,
                                       :length       => { :within => 6..40 }

def validate_password?
  if new_record?
    return true
  else
    if password.to_s.empty?
      return false
    else
      return true
    end
  end
end

также обновите метод encrypt_password, просто добавьте этот начальный код

def encrypt_password
  return if password.to_s.empty?
  ...
  ... existing code
  ... 
end
1 голос
/ 09 февраля 2012

простое редактирование проверки пароля со следующим должно работать:

validates :password, :presence     => true,
                                       :on => :create,
                                       :confirmation => true,
                                       :length       => { :within => 6..40 }
1 голос
/ 09 февраля 2012

Проблема связана с проверкой вашего присутствия атрибута вашего виртуального пароля.

Добавление :on => create остановит проверку при запуске при обновлении пользователя.

Попробуйте

validates_length_of       :password, :length => { :within => 6..40 }, :allow_blank => true
validates_confirmation_of :password
validates_presence_of     :password, :on => :create

Хороший состав рельсов здесь: http://railscasts.com/episodes/250-authentication-from-scratch

...