[RUBY-ON-RAILS] 고안와 함께 추가 등록 필드 추가
RUBY-ON-RAILS고안와 함께 추가 등록 필드 추가
나는 새로운 # 등록에 몇 가지 추가 필드를 추가하려합니다. 난 단지 추가 데이터를 원하는 다른 기능을 필요로하지 않기 때문에, 나는 # 새로운으로 다음 수정 등록 무슨 내가 한 등 정도 컨트롤러를 오버라이드 (override) 할 필요가 왜 표시되지 않습니다 :
%h2
Sign up
= form_for(resource, as: resource_name, url: registration_path(resource_name)) do ||f
= devise_error_messages!
%div
= f.label :email
%br
= f.email_field :email, autofocus: true
%div
= f.label :title_id
%br
= f.text_field :title_id
%div
= f.label :province_id
%br
= f.text_field :province_id
%div
= f.label :first_name
%br
= f.text_field :first_name
%div
= f.label :last_name
%br
= f.text_field :last_name
%div
= f.label :password
%br
= f.password_field :password
%div
= f.label :password_confirmation
%br
= f.password_field :password_confirmation
%div= f.submit 'Sign up'
= render 'devise/shared/links'
다음과 같은 소독제를 통해 이러한 추가 필드를 사용하려면, 내가와 ApplicationController 업데이트 :
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
before_filter :store_requested_url!
# before_filter :authenticate_user!
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:email) }
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :title_id, :province_id, :first_name, :last_name) }
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, :password_confirmation, :current_password) }
end
def after_sign_in_path_for(resource)
session[:requested_url] || root_path
end
private
def store_requested_url
# store last url as long as it isn't a /users path
session[:previous_url] = request.fullpath unless request.fullpath == /\/users/
end
end
어떤 이유로 작동하지 않는 여분 필드는 널 (null)로 데이터베이스로 이동합니다.
루비 2를 사용하고 고안의 3.0.0.rc.으로, 4 RC1 레일입니다
해결법
-
==============================
1.당신이 소독제를 호출하는 before_filter를 설정하지 않기 때문에 귀하의 질문에 코드 샘플이 작동하지 않는 것으로 나타납니다.
당신이 소독제를 호출하는 before_filter를 설정하지 않기 때문에 귀하의 질문에 코드 샘플이 작동하지 않는 것으로 나타납니다.
before_filter :configure_permitted_parameters, if: :devise_controller?
그렇게 말한다면 허용 대답에서와 같이, 어플리케이션 컨트롤러는 모든 시간이 검사를 수행하지 않습니다 그래서, 컨트롤러를 대체 아마 좋습니다. 허용 대답은 아래 코드와 단축 할 수있다. 내 응용 프로그램이 코드를 테스트 한 그것은 잘 작동합니다. 이 모든는 3.0.0.rc 태그의 README의 강력한 매개 변수 섹션에 설명되어 있습니다.
컨트롤러를 오버라이드 (override) :
class RegistrationsController < Devise::RegistrationsController before_filter :configure_permitted_parameters, :only => [:create] protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password) } end end
그런 다음 그것을 사용하는 경로를 업데이트 :
devise_for :members, :controllers => { :registrations => "registrations" }
-
==============================
2.OK, 난 그냥 고안 등록 컨트롤러,이를 반영하기 위해 고안 워드 프로세서에 따라 업데이트 routes.rb을 무시했다 않았다 그래서 뭐, 복사 #이 같은 만들 등록에 대한 유증 코드가 붙여, 내 자신을 사용하도록 점점 PARAMS을 일부 변경 강력한 매개 변수 방법, 그리고 그였다.
OK, 난 그냥 고안 등록 컨트롤러,이를 반영하기 위해 고안 워드 프로세서에 따라 업데이트 routes.rb을 무시했다 않았다 그래서 뭐, 복사 #이 같은 만들 등록에 대한 유증 코드가 붙여, 내 자신을 사용하도록 점점 PARAMS을 일부 변경 강력한 매개 변수 방법, 그리고 그였다.
class RegistrationsController < Devise::RegistrationsController def create build_resource(registration_params) 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? respond_with resource, :location => after_sign_up_path_for(resource) end else clean_up_passwords respond_with resource end end private def registration_params params.require(:user).permit(:email, :title_id, :first_name, :last_name, :province_id, :password, :password_confirmation) end end
-
==============================
3.유증 4.0 이후이 주제에 대한 이전 응답이 유효하지 않습니다. 대신 방법의 당신은 사용이 :
유증 4.0 이후이 주제에 대한 이전 응답이 유효하지 않습니다. 대신 방법의 당신은 사용이 :
devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
그래서,와 ApplicationController에 완벽한 솔루션 :
class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:username]) end end
-
==============================
4.유증 버전 4.3.0, 5 월 15 일 2017로, 솔루션은 문서에서 다음과 같습니다. 이 경우, 사용자 이름 필드가 추가되고있다.
유증 버전 4.3.0, 5 월 15 일 2017로, 솔루션은 문서에서 다음과 같습니다. 이 경우, 사용자 이름 필드가 추가되고있다.
class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:username]) end end
물론, 단순히 데이터베이스에 필드를 추가
> rails g migration AddUsernameToUsers class AddUsernameToUsers < ActiveRecord::Migration[5.0] def change add_column :users, :username, :string, null: false, index: true, unique: true end end
그리고 새로운 # 등록에 대한 뷰에 필요한 필드를 추가
<%= f.text_field :username, placeholder: "Username" %>
-
==============================
5.먼저 뷰를 노출
먼저 뷰를 노출
rails generate devise:views users
다음 편집 설정 / 초기화 / devise.rb 변경
# config.scoped_views = false
에
config.scoped_views = true
이것은 당신이 응용 프로그램 / 뷰 / 사용자 / 등록에서 전망을 수정할 수 있습니다.
당신은 모두 여기에 필요한 필드를 추가합니다
응용 프로그램 / 뷰 / 사용자 / 등록 / edit.html.erb
app/views/users/registration/new.html.erb
이제 우리는 레일 질량 할당 문제를 처리해야 application_controller.rb로 이동하고 before_filter를 추가
before_filter :configure_permitted_parameters, if: :devise_controller?
다음 유증의 위생에 필드 + 원본 필드를 추가
protected def configure_permitted_parameters # Fields for sign up devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password) } # Fields for editing an existing account devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :email, :password, :current_password, :gender) } end
웹 서버를 다시 시작하고 손가락을 교차.
-
==============================
6.나는 비슷한 상황 (단지 필드는 달랐다) 했어.
나는 비슷한 상황 (단지 필드는 달랐다) 했어.
여기에 공식 문서가 제공 할 수있는 방법이있다 : 그냥와 ApplicationController이를 추가 할 수 있습니다. 그리고 당신이 필요로하는, 좀 더 필요한 경우 추가 무엇에 변화 "사용자 이름".
before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) << :username end
내 응용 프로그램 컨트롤러는 다음과 같습니다
class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) << :public_name end end
더 자세한 사항은 여기에 : https://github.com/plataformatec/devise ( "강한 매개 변수")
-
==============================
7.첫째 : 레일 4 새로운 '강력한 매개 변수'문제가없는, 당신은뿐만 아니라이 조사 할 수 있습니다.
첫째 : 레일 4 새로운 '강력한 매개 변수'문제가없는, 당신은뿐만 아니라이 조사 할 수 있습니다.
당신은 당신의 사용자 모델에 새 매개 변수를 마이그레이션하는 경우. 그럼 당신이해야 할 (생성) 파일을 무시하는 것입니다 :
app/views/devise/registrations/edit.html.erb app/views/devise/registrations/new.html.erb
여기에 기본 파일을 볼 수 있습니다 : https://github.com/plataformatec/devise/tree/master/app/views/devise/registrations
당신이 당신의 자신의 @variables (새 행동과 편집과)는 자신의 registrations_controller.rb을 구현 할 수 있습니다 경우 당신의 routes.rb이를 추가하는 것이 중요하다
devise_for :users, :controllers => { :registrations => 'registrations' } resources :users
(당신이 일을하기로 결심했다면)이 보장하지만, 그건 유증 지금부터 새로운 '등록'컨트롤러를합니다.
나는 "소독제"또는 어떤이에 대한 좋은 몰라. 하지만 내 앱 난 그냥 당신에게 권장하는 사소한 변화와 함께 잘 작동합니다. 당신은 컨트롤러를 오버라이드 (override) 할 필요가 없습니다! 뷰를 재정의하는 것은 충분히있을 것입니다.
from https://stackoverflow.com/questions/16471498/adding-extra-registration-fields-with-devise by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 오류 "들러를 찾을 수 없습니다" (0) | 2020.03.02 |
---|---|
[RUBY-ON-RAILS] 레일 : 데이터베이스에 저장 번역 (0) | 2020.03.02 |
[RUBY-ON-RAILS] 어떻게 루비 온 레일즈 "꽤"형식의 JSON 출력으로 (0) | 2020.03.02 |
[RUBY-ON-RAILS] 작동하지 않는 4.0 expire_fragment / 캐시 만료 레일 (0) | 2020.03.02 |
[RUBY-ON-RAILS] 레일에서 어떻게 핸들 배수 단지에 분할 체크 박스를 체크, 또는? (0) | 2020.03.02 |