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 이상 업데이트
이 답변은 구식입니다.
- Rails 4.2.1 및 Devise 3.4.1의 "users / registration"경로에서 "users"를 "user"로 변경합니다.
devise_parameter_sanitizer.permit()
devise_parameter_sanitizer.for()
Devise 4를 대체합니다 ( # <Devise on line devise_parameter_sanitizer.for에 대한 Rails 5, 정의되지 않은 메소드`for '참조 ).
적어도 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
강력한 매개 변수에 문제가있는 것 같습니다. 여기를보고 코드를 복사하십시오.
해당 파일을 프로젝트의 동일한 위치에 복사하십시오. 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
'programing' 카테고리의 다른 글
Charles Proxy로 상태 코드를 다시 작성할 수 있습니까? (0) | 2021.01.17 |
---|---|
값 배열을 사용하는 lodash 필터 컬렉션 (0) | 2021.01.17 |
잘못된 이미지 경로- "CFBundleIconFile"키 아래에 참조 된 경로에 이미지가 없습니다. Icon.png (0) | 2021.01.17 |
Github에서 푸시 커밋시 오류 : 치명적 : 사용자 이름을 읽을 수 없음 (0) | 2021.01.17 |
Django 1.7에서 "django.core.exceptions.ImproperlyConfigured : 애플리케이션 레이블이 고유하지 않고 중복 : foo"를 해결하는 방법은 무엇입니까? (0) | 2021.01.17 |