복붙노트

[RUBY-ON-RAILS] 유증 4.0 레일. 중첩은 Unpermited 매개 변수 속성

RUBY-ON-RAILS

유증 4.0 레일. 중첩은 Unpermited 매개 변수 속성

내가 고안를 사용하여 웹 응용 프로그램 작업을하고 내가 2 개 별도의 양식 필드 등으로 확장 한 사용자의 모델이 4 레일하고 사용자가 로그인이 최대 그는 또한 자신의 첫 번째 / 마지막 이름을 제출할 수 있습니다 때. (http://blog.12spokes.com/web-design-development/adding-custom-fields-to-your-devise-user-model-in-rails-4/ 기준). 지금은 기관 모델을 추가하고 싶습니다. 이 모델은 has_many : 사용자 및 belongs_to 사용자 : 기관. 나는 사용자를 등록 같은 양식에 기관의 이름을 등록 할 수 있어야합니다. 나는 이것이 내가 조금에 표시됩니다 부모이기 때문에 나는 내 기관 모델에 nested_attribute을 필요로 알고 있습니다. 나는 사용자가 가입 할 때 나는 콘솔에서 얻을 : Unpermited 매개 변수를 : 기관을.

내 힌트는 내 자식 클래스 (사용자)를 기반으로 내 부모 클래스 (기관)를 업데이트 할 수 없다는 것입니다. 이에 대한 해결책이 될 수 있을까요? 또는 사람이 비슷한 경험?

class Institutions < ActiveRecord::Base
    has_many :users, 
    accepts_nested_attributes_for :users
end

class User < ActiveRecord::Base
     devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable
     belongs_to :institution
end

등록은 / 여기 new.html.erb 나는 중첩 된 형태를 갖는다

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f|     %>
<%= devise_error_messages! %>
.
. 
    <%= f.fields_for :institutions do |i| %>
        <p><%= i.label :name %><br />
        <%= i.text_field :institutions_attr %></p>
    <% end %>

나는 이전에 연결 한 튜토리얼을 바탕으로, 나는 새로운 사용자 : ParameterSanitizer 다음과 같이 고안 :: ParameterSanitizer에서와 sign_up 방법 오버라이드 (override) 상속을 만들었습니다 :

lib 디렉토리 / user_sanitizer.rb

private
def sign_up
    default_params.permit(:first_name, :last_name ,:email, :password,  :password_confirmation, :current_password, institutions_attributes: [:id, :name])
end

마지막으로, 내 application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  protected
  def devise_parameter_sanitizer
    if resource_class == User
    User::ParameterSanitizer.new(User, :user, params)
    else 
    super
    end
  end
end

읽어 주셔서 감사합니다!

콘솔 출력을 PARAMS :

{"utf8"=>"✓",
 "authenticity_token"=>"JKuN6K5l0iwFsj/25B7GKDj7WEHR4DO3oaVyGxGJKvU=",
 "user"=>{"email"=>"abc@foo.com",
 "first_name"=>"abc",
 "last_name"=>"xyz",
 "institutions"=>{"name"=>"Government"},
 "password"=>"[FILTERED]",
 "password_confirmation"=>"[FILTERED]"},
 "commit"=>"Sign up"}

편집하다

제안, 나는 추가

params.require(resource_name).permit( :email, :first_name, :last_name, institution:  [:name], :password, :password_confirmation ) and I get an *error syntax error, unexpected ',', expecting => ...nstitution: [:name], :password, :password_confirmation )*

하지만, 나는에 편집을 다시하는 경우

params.require(resource_name).permit( :email, :first_name, :last_name, :password, :password_confirmation, institution:  [:name] ) 

나는 NO 구문 오류가 발생하지만 Unpermited 매개 변수를 얻을 : 기관을 요청합니다.

내 믿음은 사용자가 기관의 자식이기 때문에 이런 일이 발생한다는 것입니다. 나는, 그러나 해결 방법이를 찾을 수 없었습니다.

해결법

  1. ==============================

    1.설정 / routes.rb

    설정 / routes.rb

    그래서 ... (여기 무시 컨트롤러의 자세한 내용은 고안의 설명서를 참조하십시오 ...)처럼와 ApplicationController를 통해 그 일을 반대로 더 우아한 방법이다 ... 자신의 등록 컨트롤러 만들기

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

    응용 프로그램 / 컨트롤러 / 사용자 / registrations_controller.rb

    configure_permitted_parameters 방법을 실행하기 ... 같은 매개 변수를 소독하기 전에 사용자 모델과 연관된 프로파일을 만들 수있는 새로운 방법을 재정의 (주 중첩 된 매개 변수를 추가하는 방법)

    class Users::RegistrationsController < Devise::RegistrationsController
    
      before_filter :configure_permitted_parameters
    
      # GET /users/sign_up
      def new
    
        # Override Devise default behaviour and create a profile as well
        build_resource({})
        resource.build_profile
        respond_with self.resource
      end
    
      protected
    
      def configure_permitted_parameters
        devise_parameter_sanitizer.for(:sign_up) { |u|
          u.permit(:email, :password, :password_confirmation, :profile_attributes => :fullname)
        }
      end
    end
    

    DB / 마이그레이션 / xxxxxxxxxxxxxx_create_profiles.rb

    이 프로필 모델을 (사용자에 대한 참조를 참고)를 생성 마이그레이션입니다 ...이 예제 프로파일은 사용자의 확장으로 전체 이름을 유지하지만, 당신이 원하는대로 추가 부담!

    class CreateProfiles < ActiveRecord::Migration
      def change
        create_table :profiles do |t|
           t.references :user
           t.string :fullname
           t.timestamps
        end
      end
    end
    

    응용 프로그램 / 모델 / user.rb

    class User < ActiveRecord::Base
    
      # Associations
      has_one :profile, dependent: :destroy, autosave: true
    
      # Allow saving of attributes on associated records through the parent,
      # :autosave option is automatically enabled on every association
      accepts_nested_attributes_for :profile
    
      # Devise
      # Include default devise modules. Others available are:
      # :confirmable, :lockable, :timeoutable and :omniauthable
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :trackable, :validatable
    end
    

    응용 프로그램 / 모델 / profile.rb

    class Profile < ActiveRecord::Base
    
      # Associations
      belongs_to :user
    
      # Validations
      validates :fullname, presence: true
    end
    

    응용 프로그램은 / / 궁리 / 등록 / new.html 전망

    <% resource.build_profile if resource.profile.nil? %>
    <%= form_for(resource, :as => resource_name,
                           :url => registration_path(resource_name)) do |f| %>
      <ul>
    
        <%= devise_error_messages! %>
    
        <li class="fullname">
          <%= f.fields_for :profile do |profile_fields| %>
            <%= profile_fields.label :fullname %>
            <%= profile_fields.text_field :fullname %>
          <% end %>
        </li>
        <li class="email">
          <%= f.label :email %>
          <%= f.email_field :email, :autofocus => true %>
        </li>
        <li class="password">
          <%= f.label :password %>
          <%= f.password_field :password %>
        </li>
        <li class="password">
          <%= f.label :password_confirmation %>
          <%= f.password_field :password_confirmation %>
        </li>
        <li>
          <%= f.submit %>
        </li>
        <li>
          <p><%= render "devise/shared/links" %></p>
        </li>
      </ul>
    <% end %>
    
  2. ==============================

    2.당신은 여기에 어떻게, 그렇게 할 자신의 등록 컨트롤러를 작성해야합니다 :

    당신은 여기에 어떻게, 그렇게 할 자신의 등록 컨트롤러를 작성해야합니다 :

    routes.rb

    devise_for :users, controllers: {registrations: 'registrations'}
    

    제어 장치

    당신은 교체해야합니다 your_fields를 허용 할 필드로 (미안 해요 당신을 떠날 경우,하지만 통과 할 누군가를 위해 내 대답이 더 때문에, 일반적으로 사용 가능합니다)

    class RegistrationsController < Devise::RegistrationsController
    
      private
    
        def sign_up_params
          allow = [:email, :your_fields, :password, :password_confirmation]
          params.require(resource_name).permit(allow)
        end
    
    end
    

    추가 정보 (일부 테스트 + 중첩 된 속성)

    또한 당신이 연결을 사용하는 경우주의하고 PARAMS있을 것이다 accepts_nested_attributes_for이 같은 구조

    모델 : {필드, 필드, 필드, associated_model : {필드, 필드}}

    물론 떨어져 당신은 당신의 sign_up_params 방법으로 동일한 구조를 사용해야합니다. 당신이 이해할 필요가있는 경우,이 같은 sign_up_params 방법의 내용을 변경할 수 있습니다 :

        def sign_up_params
          params.require(resource_name).permit!
        end
    

    즉, 다음 양식을 게시, 어떤 PARAM을 수 PARAMS의 구조를 볼 수 콘솔 (그것은이 시간을 통과해야한다)와 레일에 보면, 결국 당신은 설정 할 수 있습니다 sign_up_params 방법을 제대로

    http://www.railsexperiments.com/using-strong-parameters-with-nested-forms/ 대한 추가 정보를 원하시면이 옵션을 선택합니다

    귀하의 경우에 당신은 사용해야합니다 :

    params.require (RESOURCE_NAME) .permit (: 이메일 : FIRST_NAME : LAST_NAME, 기관 : [: 이름] : 비밀번호 : password_confirmation)

  3. ==============================

    3.사용하면 5.1 및 유증 4.4.1 다음은 짧은이며, 꽤 좋은 작동 레일 :

    사용하면 5.1 및 유증 4.4.1 다음은 짧은이며, 꽤 좋은 작동 레일 :

    응용 프로그램 / 모델 / user.rb

    after_initialize do
      build_profile if new_record? && profile.blank?
    end
    

    응용 프로그램 / 컨트롤러 / application_controller.rb

    before_action :configure_permitted_parameters, if: :devise_controller?
    
    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [{ profile_attributes: :name }])
    end
    

    여기서 핵심은 별도의 컨트롤러없이 다음을 수행 할 수 있다는 것입니다 :

  4. from https://stackoverflow.com/questions/17767449/rails-4-0-with-devise-nested-attributes-unpermited-parameters by cc-by-sa and MIT license