2011-05-23 16 views
10

मैं अपने आवेदन में डेविस को एकीकृत करने की कोशिश कर रहा हूं। मुझे पृष्ठ के शीर्ष पर लॉगिन फॉर्म लागू करने की आवश्यकता है (मैंने इस फ़ॉर्म को लेआउट पेज में कार्यान्वित किया है) और मैंने पंजीकरण फॉर्म लागू किया है जिसमें पंजीकरण फॉर्म शामिल है। लेकिन जब मैंने गलत पंजीकरण डेटा सबमिट करने का प्रयास किया तो यह दोनों रूपों के लिए सत्यापन त्रुटियों को दिखाता है।डेविस। पंजीकरण और लॉगिन उसी पृष्ठ पर

+0

क्या आप प्रासंगिक विचार/नियंत्रक कोड दिखा सकते हैं? इस मामले के बारे में –

+0

[यहां मेरा जवाब देखें] (http://stackoverflow.com/a/17001874/1297435)। –

उत्तर

6

अधिक जानकारी के बिना, यह अनुमान लगाना मुश्किल है कि समस्या क्या है। मैं, वास्तव में सहायक (और तेजी से तो) होने के लिए विकी पृष्ठों मिल गया है, चाहे आप पहले हो सकता है उन पर देखा:

Devise Wiki Pages

दो पृष्ठों कि अपनी आवश्यकताओं के लिए प्रासंगिक हो सकता है:

Display a custom sign_in form anywhere in your app

Create custom layouts

आशा है कि इससे मदद मिलती है!

- एफएफ

+0

मुझे समस्या मिली यह डेविस पर निर्भर नहीं था। मैं प्रत्येक प्रपत्र के लिए ऑब्जेक्ट नाम बदलता हूं और यह सही तरीके से काम करता है। –

+1

@VitalyAksionchyk क्या आप वर्णन कर सकते हैं कि आपने अधिक विस्तार से क्या किया? – flynfish

+0

मेरे लिए, 'simple_form_for ("उपयोगकर्ता", ... से 'simple_form_for (" उपयोगकर्ता ", ...' में परिवर्तन – mirelon

0

आप पृष्ठ पर दो रूपों होना चाहिए - साइन अप करने के लिए एक और पंजीकरण के लिए एक। यदि आप एक ही फॉर्म और कई संभावित कार्रवाइयां चाहते हैं तो आपको क्लाइंट पक्ष को संभालने वाले कुछ बटनों की आवश्यकता होगी और उपयोगकर्ता या सत्र बनाने के आधार पर उपयुक्त मार्ग पर & विधि को बदल दें।

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

3

दोनों रूपों के लिए सत्यापन त्रुटियों को देखने की समस्या 2 चीजों से उत्पन्न होती है। सबसे पहले, फॉर्म बनाने के लिए एक सामान्य 'संसाधन' सहायक का उपयोग करें। यह उपयोगकर्ता ऑब्जेक्ट बनाता है, और उसी उपयोगकर्ता objet को साइन अप और साइन इन फॉर्म दोनों के लिए उपयोग किया जाता है। दूसरा, devise त्रुटियों को आम तौर पर 'devise_error_messages' का उपयोग करके प्रदर्शित किया जाता है! सहायक जो समान साझा संसाधन का उपयोग करता है।

साइन इन करने के लिए और उसी पृष्ठ पर साइन अप करने के लिए आपको प्रत्येक फॉर्म के लिए अलग-अलग उपयोगकर्ता ऑब्जेक्ट्स बनाने और त्रुटि संदेशों को प्रदर्शित करने का एक नया तरीका बनाने की आवश्यकता है।

सबसे पहले, आप अपने खुद के पंजीकरण नियंत्रक बनाने के लिए (एप्लिकेशन/नियंत्रक/उन में /) और अपने मार्गों फ़ाइल तदनुसार

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

इसके बाद आप करेंगे अद्यतन की आवश्यकता होगी

class Users::RegistrationsController < Devise::RegistrationsController 
    include DevisePermittedParameters 

    protected 

    def build_resource(hash=nil) 
    super 
    # Create an instance var to use just for the sign up form 
    @sign_up_user = self.resource 
    end 
end 

अपने स्वयं के त्रुटि संदेश और संसाधन सहायकों की आवश्यकता है। इसलिए जैसे

module DeviseSinglePageHelper 
    def devise_error_messages_for_same_page(given_resource) 
    return "" if given_resource.errors.empty? 

    messages = given_resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join 
    sentence = I18n.t("errors.messages.not_saved", 
         count: given_resource.errors.count, 
         resource: given_resource.class.model_name.human.downcase) 

    html = <<-HTML 
    <div id="error_explanation"> 
    <h2>#{sentence}</h2> 
    <ul>#{messages}</ul> 
    </div> 
    HTML 

    html.html_safe 
    end 

    def sign_up_user 
    @sign_up_user ||= User.new(username: 'su') 
    end 

    def sign_in_user 
    @sign_in_user ||= User.new(username: 'si') 
    end 
end 

अंत में, अपने विचारों में, अद्यतन अपने रूपों: devise_single_page_helper.rb की तरह एक नई सहायक बना सकते हैं और निम्नलिखित जोड़ें

-# The sign up form 
    = simple_form_for(sign_up_user, url: registration_path(resource_name)) do |f| 
    -#... 
    = devise_error_messages_for_same_page(sign_up_user) 


    -# The sign in form 
    = simple_form_for(sign_in_user, url: sessions_path(resource_name)) do |f| 
    #... 
    = devise_error_messages_for_same_page(sign_in_user) 

यह सब एक साथ आप 2 अलग-अलग वस्तुओं देता है - 1 साइन अप के लिए और साइन इन के लिए 1। यह त्रुटि संदेश को दूसरे में दिखाए जाने से रोक देगा।कृपया ध्यान दें कि आपके साइन इन पेज पर दोनों फॉर्म डालने की अनुशंसा करें (और शायद डिफ़ॉल्ट साइन अप पेज साइन इन पेज पर रीडायरेक्ट हो) क्योंकि डिफ़ॉल्ट रूप से एक विफल साइन इन प्रयास साइन इन पेज पर रीडायरेक्ट करेगा।

संबंधित मुद्दे