programing

Rails 4.0의 Devise에 새 필드를 추가하는 허용되지 않는 매개 변수

yoursource 2021. 1. 17. 12:24
반응형

Rails 4.0의 Devise에 새 필드를 추가하는 허용되지 않는 매개 변수


레일 작업에 매우 익숙합니다. Devise를 사용하여 기본 로그인 시스템을 구현했습니다. sign_up 페이지에 몇 가지 새 필드 (bio : string, name : string)를 추가하려고합니다. 모든 것이 올바르게 표시되고 새 필드가 데이터베이스에 추가되지만 (SQLbrowser에서 볼 때) 채워지지 않고 사용자가 sign_up 양식을 제출 한 후 다음과 같은 메시지가 표시됩니다.

Unpermitted parameters: bio, name

_devise_create_users.rb에 2 개의 문자열을 추가했습니다.

  # added
  t.string :bio
  t.string :name

그리고 schema.rb에 표시됩니다.

ActiveRecord::Schema.define(version: 20130629002343) do

  create_table "users", force: true do |t|
    t.string   "email",                  default: "",    null: false
    t.string   "encrypted_password",     default: "",    null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "shortbio"
    t.boolean  "admin",                  default: false
    t.string   "realname"
    t.string   "name"
    t.string   "bio"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true

end

내 user.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
   #:token_authenticatable, :confirmable,
   #:lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

end

이 문제는 Strong Parameters와 관련이 있습니까? 나는 그들 주위에 내 머리를 감싸고 어디에서 / 어떻게 구현하는 데 어려움을 겪고 있습니다.


허용되는 솔루션은 충분하지만 두 가지 문제가 있습니다. 1) 모든 컨트롤러가 현재 컨트롤러가 devise 컨트롤러 ( if: :devise_controller?)인지 확인하고 2) 메서드 ( ...for(:sign_up) {|u| u.permit(:bio, :name)}) 에 허용되는 모든 매개 변수를 작성해야 합니다 :email. :password등등.

더 우아한 솔루션이 될 수 있다고 생각합니다.

# app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  before_filter :configure_permitted_parameters

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up).push(:name, :phone, :organization)
  end
end

# config/routes.rb
devise_for :users, :controllers => { :registrations => "users/registrations" }

참고 : Rails 4.2 이상 업데이트

이 답변은 구식입니다.


적어도 Devise 3.0.0을 사용하고 있는지 확인하십시오. 애플리케이션 컨트롤러에 추가하십시오.

before_filter :update_sanitized_params, if: :devise_controller?

def update_sanitized_params
  devise_parameter_sanitizer.for(:sign_up) {|u| u.permit(:bio, :name)}
end

문서 : https://github.com/plataformatec/devise#strong-parameters


나도 이것에 문제가 있었다. devise의 사이트에 대한 문서와 일부 포럼이 도움이되었습니다. 내가 한 일은 다음과 같습니다.

사용자 정의 RegistrationsController (app / controllers / users / registrations_controller.rb)

# app/controllers/users/registrations_controller.rb

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

    def update_sanitized_params
       devise_parameter_sanitizer.for(:sign_up) {|u| u.permit(:name, :email,   :password, :password_confirmation)}
    end
end

그런 다음 경로 파일 (config / routes.rb)에서 devise_for 문에 대해 다음을 입력합니다.

devise_for :users, controllers: {registrations: "users/registrations"}

내 rails 4.2.1 앱에서 작동하는 또 다른 간단한 방법이 있습니다.

다음 파일 생성

/config/initializers/devise_permitted_parameters.rb

그리고 코드 ..

module DevisePermittedParameters
  extend ActiveSupport::Concern

  included do
    before_filter :configure_permitted_parameters
  end

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :name
    devise_parameter_sanitizer.for(:account_update) << :name

    devise_parameter_sanitizer.for(:sign_up) << :bio
    devise_parameter_sanitizer.for(:account_update) << :bio
  end

end

DeviseController.send :include, DevisePermittedParameters

sign_up 및 account_update 모두에 대해 다음을 수행하십시오. controllers/applcation_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :authenticate_user!

  before_action :configure_permitted_parameters, if: :devise_controller?
  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:password, :password_confirmation,:current_password,:email,:name, :phonenumber,:province,:city,:area,:idcardimg,:role) }
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:password, :password_confirmation,:current_password,:email,:name, :phonenumber,:province,:city,:area,:idcardimg,:role) }
  end
end

강력한 매개 변수에 문제가있는 것 같습니다. 여기를보고 코드를 복사하십시오.

https://github.com/plataformatec/devise/blob/rails4/app/controllers/devise/registrations_controller.rb

해당 파일을 프로젝트의 동일한 위치에 복사하십시오. app/controllers/devise/registrations_controller.rb

만들기 작업의 코드를 변경하십시오.

# POST /resource
def create
  # THIS LINE IS THE ONE YOU CHANGE
  self.resource = build_resource(sign_up_params.merge(:bio, :name))

  if resource.save
    if resource.active_for_authentication?
      set_flash_message :notice, :signed_up if is_navigational_format?
      sign_up(resource_name, resource)
      respond_with resource, :location => after_sign_up_path_for(resource)
    else
      set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
      expire_session_data_after_sign_in!
      respond_with resource, :location => after_inactive_sign_up_path_for(resource)
    end
  else
    clean_up_passwords resource
    respond_with resource
  end
end

I must tell you that Iam not pretty sure if this works because I don't use devise but seeing the code it seems it will work.


Devise prepared everything for that :

In the users controller you have

private

# Never trust parameters from the scary internet, only allow the white list through.
def user_params
  params.require(:user).permit(:full_name <add your parameter>)
end

ReferenceURL : https://stackoverflow.com/questions/17384289/unpermitted-parameters-adding-new-fields-to-devise-in-rails-4-0

반응형