Разрешение пользователям редактировать учетные записи без сохранения паролей в условиях разработки и передачи: reject_if в Ruby - PullRequest
1 голос
/ 09 января 2012

Я работаю над приложением ROR и застрял, когда дело доходит до разработки и подтверждения пароля.Я хотел бы, чтобы мои пользователи могли редактировать свою информацию (имя, местоположение и т. Д.) Без необходимости вводить и подтверждать свой пароль (то есть, если они не решат изменить свой пароль, в этом случае эти поля будут обязательными).)

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

Однако я нашел обходной путь, но у меня возникла проблема, которая, я надеюсь, будет окончательной.шаг.Вот небольшой фрагмент того, как выглядит мой players.rb файл (у меня есть два набора учетных записей - игроков и владельцев):

 has_one :account, :as => :profile

 accepts_nested_attributes_for :account, :reject_if => proc { |attributes| attributes['password'].blank? }

мой accounts.rb файл выглядит так:

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :invited_by, :invited_by_id

Так как он настроен прямо сейчас, игроки могут редактировать свой профиль без необходимости ввода пароля, если они не пытаются редактировать поле: пароль - это отлично, и мой желаемый результат.Однако, я сталкиваюсь с небольшим препятствием ... :reject_if => proc { |attributes| attributes['password'].blank? } выполняется, даже когда создается новая учетная запись (игрок)!Это означает, что если игрок не вводит пароль, вместо того, чтобы предлагать ему ввести пароль, приложение тормозит!

Мне нужна помощь в написании оператора if или какого-либо условия, которое в основном вызывает только reject_ifусловия, если Учетная запись принадлежит зарегистрированному (существующему) игроку.

Я пытался: :reject_if => proc { |attributes| attributes['password'].blank? unless Player.new}

и

if Player.new
accepts_nested_attributes_for :account
else
accepts_nested_attributes_for :account, :reject_if => proc { |attributes| attributes['password'].blank? }
end

Я не могу понять это,поэтому я решил посмотреть, может ли кто-нибудь предложить свое мнение или совет.Как всегда, я очень благодарен за ваше время и любую помощь, которую вы можете предложить.Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 марта 2013

У меня был этот вопрос, чтобы преследовать меня в течение долгого времени.Решил его, следуя инструкциям «Как», затем добавил: current_password к attr_accessible и создал attr_accessor со следующим:

attr_accessor :password, :password_confirmation, :current_password
attr_accessible :email, :password, :password_confirmation, :remember_me, :username, :current_password

В случае, если кто-то еще столкнется с этой проблемой, вот ссылки, которые помогли мне:

1) Как: Разрешить пользователям редактировать свою учетную запись без ввода пароля

2) Не удается разрешить "Текущий пароль не может бытьпусто "при редактировании пользователя

3) Проблемы с попыткой" обновить информацию профиля пользователя без пароля (это тот, который решил ее для меня)

Кроме того, вот руководство по тому, как сделать то же самое с Facebook через Devise & Omniauth:

4) Редактирование пользователей с помощью Devise и Omniauth

1 голос
/ 09 января 2012

Попробуйте этот код при обновлении пользователя в контроллере. Это метод обновления для разработки версии 1.5.3, эти две строки помогут.

 def update
    self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)

    params[:user].delete(:password) if params[:user][:password].blank?
    params[:user].delete(:password_confirmation) if params[:user][:password_confirmation].blank?

    if resource.update_attributes(params[resource_name]) 
      set_flash_message :notice, :updated if is_navigational_format?
      sign_in resource_name, resource, :bypass => true
      respond_with resource, :location => after_update_path_for(resource)
    else
      clean_up_passwords(resource)
      respond_with_navigational(resource){ render_with_scope :edit }
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...