2013-05-09 11 views
13

के साथ अतिरिक्त पंजीकरण फ़ील्ड जोड़ना मैं पंजीकरण # नए में कुछ अतिरिक्त फ़ील्ड जोड़ने की कोशिश कर रहा हूं। जब से मैं केवल अतिरिक्त डेटा चाहते हैं और विभिन्न कार्यक्षमता की जरूरत नहीं है, मैं नहीं देख पा रहे हैं कारण है कि मैं नियंत्रकों ओवरराइड करने के लिए आदि तो क्या मैंने किया था संशोधित पंजीकरण था # नई इस प्रकार की जरूरत है:डेविस

enter image description here

इन सक्षम करने के लिए प्रक्षालक के माध्यम से अतिरिक्त क्षेत्रों, मैं ApplicationController इस प्रकार अद्यतन:

enter image description here

किसी कारण से, यह काम नहीं कर रहा है और अतिरिक्त क्षेत्रों nulls के रूप में डेटाबेस में जाते हैं।

मैं रूबी 2 और रेल 4 आरसी 1 का उपयोग कर रहा हूं, डेविस 3.0.0.rc. के साथ

+52

कोड छवि के रूप में नहीं, पाठ के रूप में पोस्ट किया जाना चाहिए। –

+0

आपको एप्लिकेशन नियंत्रक में एक नया फ़ंक्शन चाहिए। https://github.com/plataformatec/devise#strong-parameters –

उत्तर

8

ठीक है, तो मैंने जो किया वह सिर्फ डेविस पंजीकरण नियंत्रक को ओवरराइड कर रहा था, इसे प्रतिबिंबित करने के लिए तैयार दस्तावेज़ों के अनुसार मार्ग.आरबी अपडेट करें, रजिस्ट्रेशन के लिए डेविस कोड की प्रतिलिपि बनाई गई है और चिपकाया गया है, जैसा कि है, और हो रही पैराम्स भाग को बदलें अपने स्वयं के मजबूत पैरामीटर विधि का उपयोग करने के लिए, और वह वह था।

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 
+19

कृपया अपना कोड सादा पाठ के रूप में पोस्ट करें। – mindtonic

+2

@ मिंडटनिक मैंने अभी इस पोस्ट को संपादित किया है, इसलिए यह एक छवि के बजाय एक कोड था :) –

+0

और यह न भूलें:: नियंत्रक => {: registrations => 'registrations'} –

2

पहला: क्या रेल 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

आप एक खुद registrations_controller.rb लागू करने के लिए चाहते हो सकता है अगर (के साथ फिर तुम सब करने की है ओवरराइड करने के लिए (बनाने) फ़ाइलें है कार्रवाई के लिए नए और संपादित करें) और अपने खुद के @variables तो यह आपके routes.rb

devise_for :users, :controllers => { :registrations => 'registrations' } 
resources :users 

यह सुनिश्चित करता है में जोड़ने के लिए महत्वपूर्ण है, कि वसीयत अब से अपने नए 'पंजीकरण' नियंत्रक लेता है (यदि आप का फैसला किया एक)।

मुझे "sanitizer" नहीं पता है या यह क्या अच्छा है। लेकिन मेरी ऐप उन मामूली बदलावों के साथ ठीक काम करती है जो मैंने आपको अभी अनुशंसा की है। आपको नियंत्रक को ओवरराइड करने की आवश्यकता नहीं है! विचारों को ओवरराइड करना पर्याप्त होगा।

+0

मैंने अपनी परियोजना में विचारों की प्रतिलिपि बनाई। मैंने नियंत्रकों को ओवरराइड नहीं किया है क्योंकि मुझे किसी भी व्यवहार को बदलने की ज़रूरत नहीं है। लगता है कि मजबूत पैराम के लिए सैंटिज़र एक रैपर होता है। क्या आपके ऐप में पंजीकरण के लिए अतिरिक्त फ़ील्ड हैं # नया? – Lee

+0

हां, इसलिए लोग इस ऐप में क्रेडिट कार्ड के साथ भुगतान कर सकते हैं, वे जिस योजना के लिए निर्णय लेते हैं उसके आधार पर उन्हें "भूमिका" मिलती है। मेरे पास मेरे फॉर्म में 2 अतिरिक्त फ़ील्ड हैं। आप सही हैं, आपको नियंत्रक को ओवरराइड करने की आवश्यकता नहीं है जबतक कि आप एक बदले व्यवहार नहीं चाहते हैं। – rubybrah

26

ऐसा लगता है कि आपके सवाल में कोड नमूना काम नहीं कर रहा है क्योंकि आप before_filter प्रक्षालक कॉल करने के लिए की स्थापना नहीं कर रहे हैं।

before_filter :configure_permitted_parameters, if: :devise_controller? 

ने कहा कि के साथ, यह शायद के रूप में स्वीकार जवाब में दिखाया गया है, ताकि आवेदन नियंत्रक इस समय के सभी की जाँच नहीं कर रहा है, नियंत्रक ओवरराइड करने के लिए बेहतर है। स्वीकार किए गए उत्तर को नीचे दिए गए कोड के साथ छोटा किया जा सकता है। मैंने अपने कोड के साथ इस कोड का परीक्षण किया है और यह अच्छी तरह से काम करता है। यह सब 3.0.0.rc टैग में README के मजबूत पैरामीटर अनुभाग में प्रलेखित है।

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

नीचे दिए गए अन्य उत्तरों के अनुसार नवीनतम अपडेट को इंगित करने के लिए डिवीजन 4.2 के लिए अद्यतन: 'devise_parameter_sanitizer.permit (: sign_up) {| u | u.permit (: उपयोगकर्ता नाम, ईमेल, पासवर्ड)} ' –

6

मैं ऐसी ही स्थिति मिला है (बस खेतों अलग थे)

नियंत्रक ओवरराइड।

आधिकारिक दस्तावेज ऑफ़र करने का तरीका यहां दिया गया है: बस इसे अपने एप्लिकेशन नियंत्रक में जोड़ें। और जो कुछ भी आपको चाहिए, उसे "उपयोगकर्ता नाम" बदलें, और यदि आपको आवश्यकता हो तो कुछ और जोड़ें।

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 ("सशक्त पैरामीटर")

+1

यह करने का सबसे अच्छा तरीका है; कॉपी-पेस्टिंग कोड परेशानी के लिए पूछ रहा है। – EK0

5

पहले बेनकाब विचारों

rails generate devise:views users 

फिर संपादन config /initializers/devise.rb और

बदलें
# config.scoped_views = false 

config.scoped_views = true 

को यह आप अनुप्रयोग/विचारों/उपयोगकर्ताओं/पंजीकरण पर देखा गया संशोधित करने के लिए अनुमति देगा।

तुम दोनों

app/views/users/registration/edit.html.erb

app/views/users/registration/new.html.erb 

अब हम रेल जन असाइनमेंट मुद्दे से निपटने के लिए में फ़ील्ड्स यहाँ की जरूरत है, जोड़ देगा, application_controller.rb और एक before_filter

before_filter :configure_permitted_parameters, if: :devise_controller? 
जोड़ने के लिए जाना

तो सफ़ाई तैयार करने

अपने खेतों + मूल फ़ील्ड जोड़ने 10
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

डेविस 4.0 के बाद इस विषय पर पुराने उत्तर मान्य नहीं हैं।

devise_parameter_sanitizer.permit(:sign_up, keys: [:username]) 

तो, एक पूर्ण समाधान के लिए ApplicationController में: for विधि के बजाय आप का उपयोग करने के

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 
1

वसीयत संस्करण 4.3.0 के रूप में, मई 15 वीं 2017, समाधान इस प्रकार है दस्तावेज से। इस मामले में, उपयोगकर्ता नाम फ़ील्ड जोड़ा जा रहा है।

आप अतिरिक्त पैरामीटर की अनुमति देना चाहते मामले में (आलसी तरीका ™), आप अपने 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 

और निश्चित रूप से, बस जोड़ें अपने डाटाबेस के क्षेत्र

> 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" %>