2012-07-19 14 views
5

मैं क्षमता के साथ करने के लिए ब्लॉग \ खबर आवेदन लागू करना चाहते हैं: example.com/2012/ रेल दिनांक के आधार पर 3.2 अनुकूल यूआरएल मार्ग

  • शो: example.com/
  • सभी पोस्ट कुछ साल का जवाब दे दिखाने:

    1. जड़ में सभी पोस्ट दिखाने सभी पोस्ट कुछ वर्ष और माह का जवाब दे: example.com/2012/07/slug-of-the-post
    : example.com/2012/07/
  • इसकी तारीख और स्लग द्वारा कुछ पोस्ट दिखाने 0

    तो मैं routes.rb फ़ाइल के लिए एक mockup बनाया है:

    # GET /?page=1 
    root :to => "posts#index" 
    
    match "/posts" => redirect("/") 
    match "/posts/" => redirect("/") 
    
    # Get /posts/2012/?page=1 
    match "/posts/:year", :to => "posts#index", 
        :constraints => { :year => /\d{4}/ } 
    
    # Get /posts/2012/07/?page=1 
    match "/posts/:year/:month", :to => "posts#index", 
        :constraints => { :year => /\d{4}/, :month => /\d{1,2}/ } 
    
    # Get /posts/2012/07/slug-of-the-post 
    match "/posts/:year/:month/:slug", :to => "posts#show", :as => :post, 
        :constraints => { :year => /\d{4}/, :month => /\d{1,2}/, :slug => /[a-z0-9\-]+/ } 
    

    तो मैं index कार्रवाई में पैरामीटर साथ काम करना चाहिए और सिर्फ show कार्रवाई में स्लग द्वारा पोस्ट प्राप्त (देखना हो तारीख corect है एक विकल्प है):

    def to_param 
        "#{created_at.year}/#{created_at.month}/#{slug}" 
    end 
    
    :
    # GET /posts?page=1 
    def index 
        #render :text => "posts#index<br/><br/>#{params.to_s}" 
        @posts = Post.order('created_at DESC').page(params[:page]) 
        # sould be more complicated in future 
    end 
    
    # GET /posts/2012/07/19/slug 
    def show 
        #render :text => "posts#show<br/><br/>#{params.to_s}" 
        @post = Post.find_by_slug(params[:slug]) 
    end 
    

    इसके अलावा मैं अपने मॉडल के लिए to_param को लागू करना

    यह सब मैंने एपीआई/गाइड/एसओ में पूरी रात खोज से सीखा है।

    लेकिन समस्या है विचित्र बातें नई के रूप में मेरे लिए happenning रखना रेल के लिए:

    1. जब मैं localhost/ पर जाते हैं, एप्लिकेशन टूट जाता है और कहता है कि यह show कार्रवाई लेकिन डेटाबेस में पहली वस्तु लागू किया था के रूप में प्राप्त किया गया था: (! इस प्रकार से) वर्ष:

      No route matches {:controller=>"posts", :action=>"show", :year=>#<Post id: 12, slug: "*", title: "*", content: "*", created_at: "2012-07-19 15:25:38", updated_at: "2012-07-19 15:25:38">} 
      
    2. जब मैं localhost/posts/2012/07/cut-test एक ही बात करने के लिए जाना होता है:

      01,235,
      No route matches {:controller=>"posts", :action=>"show", :year=>#<Post id: 12, slug: "*", title: "*", content: "*", created_at: "2012-07-19 15:25:38", updated_at: "2012-07-19 15:25:38">} 
      

    मुझे लगता है बहुत आसान है कि मैं नहीं किया है कुछ है कि वहाँ है, लेकिन मैं नहीं मिल सकता है कि यह क्या है।

    वैसे भी, इस पोस्ट उपयोगी है जब यह, हल किया जाता है क्योंकि वहाँ सिर्फ तारीख और समान है, लेकिन उपयोगी नहीं प्रश्नों के बिना URL में मल के लिए समाधान कर रहे हैं हो जाएगा।

  • उत्तर

    5

    समस्या post_path(post) के रूप में पद के पथ सहायक के उपयोग में था, क्योंकि पहले पैरामीटर साल के बाद से मैं में :as => :post का उपयोग routes.rb में मैच parametrized होना चाहिए।

    फिर भी, पूरे समाधान स्पष्ट बनाने के लिए यहाँ कुछ कार्रवाई करने के लिए सभी काम है कि उचित की जरूरत है:

    1. आप उचित पथ को जोड़ना होगा प्रत्येक मैच, उदा के लिए नामों सहायकों

      # Get /posts/2012/07/slug-of-the-post 
      match "/posts/:year/:month/:slug", <...>, 
          :as => :post_date 
      

      अब आप विचारों में post_date_path("2012","12","end-of-the-world-is-near") का उपयोग कर सकते हैं।

      posts_path, posts_year_path("2012"), posts_month_path("2012","12") के लिए ठीक नाम दिया गया है।

      मैं सलाह मॉडल फ़ाइल में न तो उस मैच में :as => :post है और न ही to_param बनाने का उपयोग नहीं करने के रूप में यह कुछ आप (मेरे लिए active_admin के रूप में) की उम्मीद नहीं है तोड़ सकते हैं।

    2. नियंत्रक फ़ाइल posts-controller.rb उन पदों से भरी जानी चाहिए जिन्हें स्लग से पहले निष्कर्षण और तारीख की शुद्धता की जांच की आवश्यकता है। फिर भी इस स्थिति में यह ठीक है और कुछ भी तोड़ता है।

    3. मॉडल फ़ाइल posts.rb उचित प्रारूप में वर्ष और माह extraciton, उदा .:

      def year 
          created_at.year 
      end 
      
      def month 
          created_at.strftime("%m") 
      end 
      

      कोई to_param विधि वास्तव में जरूरत के रूप में मैं पहले से ही देखा है नहीं है के साथ भरा जाना चाहिए।

    0

    क्या यह आपकी पूरी रूट.आरबी फ़ाइल है? लगता है जैसे आपके पास resources :posts एंट्री हो सकती है, जो मूल रूप से /posts/:id से मेल खाती है। इसके अलावा, वहाँ कुछ भी नहीं मैं से मार्गों फ़ाइल पोस्ट किया है कि पदों के लिए रूट पथ से रीडायरेक्ट का कारण हो सकता है देख सकते हैं, तो यह कुछ और ही होना चाहिए वहाँ में।

    +0

    इस से पहले 2 'active_admin' के निर्देश हैं, इसलिए मुझे उन सभी संसाधनों की आवश्यकता नहीं है। – iEugene

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