Как я могу обновить только одно поле профиля пользователя в Rails 3? - PullRequest
1 голос
/ 08 августа 2011

Я адаптирую систему аутентификации из Rails 3 Tutorial Майкла Хартла (Michael Hartl), чтобы лучше узнать о rails перед (наиболее вероятным) переходом на систему, подобную authlogic или devise.Моя система аутентификации работает отлично, и у меня есть модель пользователя, которая теперь включает поля, которые создают профиль пользователя.Например, пользователи могут написать объявление о себе, например, "теннисист, скалолаз".

Что я хотел бы сделать, так это иметь возможность иметь простую форму, которая обновляет только это конкретное поле ("Вставка ").Я установил это на странице профиля пользователя, где пользователь щелкает ссылку под названием «редактировать», и это приводит к тому, что частичное рендеринг отображает форму с полем для обновления объявления пользователя, например:

в _edit_blurb.html.erb:

 <div class = "editforms">
 <%= form_for current_user do |f| %>
<div class="field">
    <%= f.text_field :blurb, :class => "inputform round", :placeholder => "blurb" %>
</div>
<div class="actions">
    <%= f.submit "Update", :class => "submit_button round mini_button" %> <br>
</div>
 <% end %>
 </div>

Эта форма подчиняется действию обновления в пользовательском контроллере и по большей части обновляет пользовательские сообщения и ничего больше.Однако один недостаток заключается в том, что это действие по обновлению отправляет нулевой пароль (поскольку в форме нет поля пароля), что приводит к изменению пароля пользователя.Это проблематично по понятным причинам.Первоначально я добавил строку: if => lamdba {new_record?||! Password.nil?} к проверке пароля, чтобы позволить обновлению из частичного редактирования edit_blurb обновлять без пароля.Но, как вы можете видеть, это позволяет сохранить нулевой пароль.

  validates :password, :presence => true,
                    :if => lambda{ new_record? || !password.nil? },
                    :confirmation => true,
                    :length => { :within => 6..40 }

Как я могу изменить либо форму, либо проверку (или оба), чтобы пользователь мог обновить объявление без обновления /ввод его пароля (и исправление проблемы с обновлением пароля до нуля)?

Я думаю, что предоставил соответствующий код, но добавлю больше, если это поможет!Спасибо всем!

1 Ответ

2 голосов
/ 10 августа 2011

что вы хотите сделать, это запретить модели пользователя сохранять пароль, если значение пароля равно нулю. Я не знаю, как настроена ваша пользовательская модель, но если вы следовали инструкции MH, пароль должен быть сохранен с помощью метода:

   before_save :encrypt_password

в User.rb. Чтобы это исправить, добавьте:

    before_save :encrypt_password, :if => lambda { !password.nil? }

Это должно работать.

...