1

ユーザーが OmniAuth を使用して Facebook と Google を使用してログインできるようにし、メールを使用してアカウントを作成できるようにします。ユーザーがアカウント情報を更新できる部分を除いて、すべてが正常に機能しています。

ユーザー名と呼ばれるフィールドを追加しました。このフィールドでは、sign_up と sign_in が Ok を処理します。更新のために、ユーザーが Facebook を使用してサインインしている場合にパスワードの入力を要求したくありませんが、ForbiddenAttributesError が発生し続けます。

ここに私が書いたコードがあります。

class Users::RegistrationsController < Devise::RegistrationsController
  before_filter :configure_permitted_parameters, if: :devise_controller?    

  def update
    @provider = Provider.find_by_user_id(current_user.id)
    @user = User.find(current_user.id)
    email_changed = current_user.email != params[resource_name][:email]
    is_omniauth_account = @provider.blank?

    successfully_updated = if is_omniauth_account
      resource.update_with_password(params[resource_name])
    else
      resource.update_without_password(params[resource_name])
    end

    if successfully_updated
      # Sign in the user bypassing validation in case his password changed
      sign_in @user, :bypass => true
      redirect_to root_path
    else
      clean_up_passwords(resource)
      render_with_scope :edit
    end
  end

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password, :password_confirmation) }
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :email, :password, :password_confirmation, :current_password) }
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :email, :password) }
  end

  def resource_params
    params.require(:user).permit(:username, :email, :password, :password_confirmation, :current_password)
  end
  private :resource_params
end
4

2 に答える 2

1

この解決策はうまくいきましたが、実行時にパラメーターを削除するのが良い方法であるかどうかわからない問題がまだあります

class Users::RegistrationsController < Devise::RegistrationsController
  before_filter :configure_permitted_parameters, if: :devise_controller?

  def update
    @provider = Provider.find_by_user_id(current_user.id)
    @user = User.find(current_user.id)
    email_changed = current_user.email != resource_params[:email]
    is_omniauth_account = !@provider.blank?
    successfully_updated = if is_omniauth_account
      devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :email, :password, :password_confirmation) }
      resource.update_without_password(devise_parameter_sanitizer.for(:account_update))      
    else
      resource.update_with_password(devise_parameter_sanitizer.for(:account_update))
    end

    if successfully_updated
      # Sign in the user bypassing validation in case his password changed
      sign_in @user, :bypass => true
      redirect_to root_path
    else
      clean_up_passwords(resource)
      render :edit
    end
  end

  def create
    super
    UserMailer.welcome(@user).deliver

  end

  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password, :password_confirmation) }
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :email, :password, :password_confirmation, :current_password) }
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :email, :password) }
  end
end
于 2013-07-04T07:46:50.493 に答える
1

強力なパラメータを処理するメソッドが定義されているようですが、アクションで使用していませんupdate

これを試してください:

successfully_updated = if is_omniauth_account
  resource.update_with_password(resource_params)
else
  resource.update_without_password(resource_params)
end
于 2013-07-03T10:46:52.373 に答える