[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.설정 / 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.당신은 여기에 어떻게, 그렇게 할 자신의 등록 컨트롤러를 작성해야합니다 :
당신은 여기에 어떻게, 그렇게 할 자신의 등록 컨트롤러를 작성해야합니다 :
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.사용하면 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
여기서 핵심은 별도의 컨트롤러없이 다음을 수행 할 수 있다는 것입니다 :
from https://stackoverflow.com/questions/17767449/rails-4-0-with-devise-nested-attributes-unpermited-parameters by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] "빈은 / 레일 : 없음 같은 파일 또는 디렉터리"Heroku가에 / 루비 2 개 레일 4w를 (0) | 2020.02.14 |
---|---|
[RUBY-ON-RAILS] 액티브 / 레일의 updated_at 컬럼의 created_at 이름 바꾸기 (0) | 2020.02.14 |
[RUBY-ON-RAILS] RoR에의 검증과 정규 표현식 4 (0) | 2020.02.14 |
[RUBY-ON-RAILS] 응용 프로그램 / 자산의 모든 CSS와 JS 파일을 처리 할 수 config.assets.precompile 설정을 레일 (0) | 2020.02.14 |
[RUBY-ON-RAILS] 어떻게 우분투에 루비를 제거 할 수 있습니다? (0) | 2020.02.14 |