2011-02-18 10 views
9

में अवैध रूप प्रस्तुतियाँ को संभालने के लिए सही तरीका मैं रेल के लिए नया हूँ और यकीन है कि मैं जिस तरह से मैं ट्यूटोरियल मैं पूरी कर चुके हैं में से कुछ में काम को पूरा किया है के साथ सहमत नहीं हूँ। अमान्य फॉर्म सबमिशन को संभालने के तरीके के साथ समस्या को हल करना होगा।रेल

class ThingsController < ApplicationController 


    # POST /things 
    def create 

    @thing = Thing.new(params[:thing]) 

    if @thing.save 
     flash[:notice] = 'Thing created' 
     redirect_to(@thing) 
    else 
     render :action => :new 
    end 

    end 

@ thing.save विफल रहता है, उपयोगकर्ता एक ही फार्म के साथ, क्या चला गया की एक फ्लैश के साथ प्रस्तुत किया जाता है तो साथ पहले से भरे हुए बाहर मूल्यों वह अभी-अभी डाला के साथ: काम करने के मानक तरीका होने लगते हैं गलत। अभी तक इतना अच्छा है, सिवाय इसके कि अब यूआरएल चीजों/चीजों से चीजों में बदल गया है/जो कि इसके बजाय इंडेक्स व्यू को प्रस्तुत करने की उम्मीद करेगा।

इसके अलावा, अगर उपयोगकर्ता पेज ताज़ा करता है, वह अब सूचकांक दृश्य को देख रहा है। यदि वह वापस क्लिक करता है, तो उसे फ़ॉर्म को पुनः सबमिट करने के लिए कहा जाता है, जिसे मैंने हमेशा से बचने की कोशिश की है। अगर मैं redirect_to (new_thing_path) को रीडायरेक्ट करता हूं, तो उपयोगकर्ता की पिछली सबमिशन गुम हो जाती है, जैसे त्रुटि संदेश हैं।

मुझे एहसास है कि यह विधि "सही" हो सकती है, क्योंकि किसी वस्तु वस्तु का निर्माण/चीजों को पोस्ट करने का परिणाम होना चाहिए, लेकिन उपयोगकर्ता-इंटरफ़ेस-वार, मुझे विशेष रूप से इसकी परवाह नहीं है।

मैं कर सकता "मैन्युअल" उपयोगकर्ता के सत्र में अमान्य @thing वस्तु बचाने के लिए, प्रदर्शित करने के लिए के बाद मैं उसे वापस new_thing_path को अनुप्रेषित, लेकिन यह एक हैक की तरह लगता है। ऐसा लगता है कि ऐसा करने का "रेल मार्ग" होना चाहिए।

विचार?

+0

मेरे पास रेल कोर के बारे में बिल्कुल वही शिकायत है, लेकिन आपने इसे मुझसे बेहतर कहा है :) अच्छा सवाल। – Andrew

उत्तर

3

जब आप resources :things निर्दिष्ट आप डिफ़ॉल्ट रूप से, मिल गया है के रूप में, एक नई बात पैदा करने के लिए पोस्ट पथ /things पर है।

things GET /things(.:format)   {:action=>"index", :controller=>"things"} 
      POST /things(.:format)   {:action=>"create", :controller=>"things"} 
new_thing GET /things/new(.:format)  {:action=>"new", :controller=>"things"} 
edit_thing GET /things/:id/edit(.:format) {:action=>"edit", :controller=>"things"} 
    thing GET /things/:id(.:format)  {:action=>"show", :controller=>"things"} 
      PUT /things/:id(.:format)  {:action=>"update", :controller=>"things"} 
      DELETE /things/:id(.:format)  {:action=>"destroy", :controller=>"things"} 

ऐसा लगता है कि आप अधिक कुछ इस तरह हैं::

resources :things, :except => [ :create ] do 
    post "create" => "things#create", :as => :create, :path => 'new', :on => :collection 
end 
:

create_things POST /things/new(.:format)  {:action=>"create", :controller=>"things"} 
     things GET /things(.:format)   {:action=>"index", :controller=>"things"} 
    new_thing GET /things/new(.:format)  {:action=>"new", :controller=>"things"} 
    edit_thing GET /things/:id/edit(.:format) {:action=>"edit", :controller=>"things"} 
     thing GET /things/:id(.:format)  {:action=>"show", :controller=>"things"} 
       PUT /things/:id(.:format)  {:action=>"update", :controller=>"things"} 
       DELETE /things/:id(.:format)  {:action=>"destroy", :controller=>"things"} 

हालांकि यह अनुशंसित नहीं, तो आपको निम्न मार्ग के साथ इस परिणाम प्राप्त कर सकते हैं यहाँ rake routes के लिए उत्पादन है

आपको अपने पथ को सही पथ पर पोस्ट करने के लिए संशोधित करने की भी आवश्यकता होगी।

सभी ही कहा जा रहा, यूआरएल अपने प्रश्न में आप का वर्णन सही ध्वनि नहीं है। आप निम्न सूची: एक नया thing (/things/new पर प्रस्तुत करने के एक फार्म), /things

  • को /things/new से

    1. URL परिवर्तन वापस संकेतों पर क्लिक करने से प्रपत्र फिर से जमा करने जमा करने के बाद
    2. ताज़ा किया जा रहा से पता चलता things#index

    यह नहीं मैं अपने खुद के रेल 3 अनुप्रयोगों में अनुभव कार्यक्षमता है।इसके बजाय, मुझे लगता है कि: एक नया thing (/things/new पर प्रस्तुत करने के एक फार्म), /things को /things/new से

    1. URL परिवर्तन (यह एक ही है)
    2. वापस क्लिक करने करने के लिए उपयोगकर्ता वापस लेता जमा करने के बाद गैर -submitted प्रपत्र (एक फिर से इस पद के लिए कोई अनुरोध)
    3. ताज़ा किया जा रहा संकेतों का रूप फिर से जमा करने (मेरी राय में अपेक्षा के अनुरूप)
  • +1

    धन्यवाद ब्रैंडन। यह सहायक है, हालांकि मुझे अभी भी डिफ़ॉल्ट कार्यक्षमता की परवाह नहीं है। मुझे लगता है कि जितना संभव हो सके उससे बचने के लिए मैं जावास्क्रिप्ट सत्यापन का उपयोग करूंगा। – dearlbry

    0

    मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन एक दृष्टिकोण जो मैं हाल ही में खेल रहा हूं वह AJAX के साथ फ़ॉर्म जमा करना है, भले ही इसे अन्यथा इसकी आवश्यकता न हो। यह आपको रूट्स के रूप में डिफ़ॉल्ट रूप से बनाने/अपडेट करने की क्रिया में सबमिट करने देता है, लेकिन ब्राउज़र में यूआरएल नहीं बदलता है। प्रतिक्रिया/इंडेक्स पेज के लिंक या जहां भी आप एक सफल सहेजने पर रीडायरेक्ट करते हैं, या त्रुटि संदेश के साथ "400 खराब अनुरोध" के साथ सफलता के लिए प्रतिक्रिया एक साधारण 200 हो सकती है यदि डेटा अमान्य था।

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