복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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.유증 버전 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. ==============================

    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. ==============================

    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. ==============================

    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) 할 필요가 없습니다! 뷰를 재정의하는 것은 충분히있을 것입니다.

  8. from https://stackoverflow.com/questions/16471498/adding-extra-registration-fields-with-devise by cc-by-sa and MIT license