2010-09-24 18 views
63

Getting Started Rails Guide इस भाग पर चमक की तरह क्योंकि यह टिप्पणियाँ नियंत्रक की "नई" कार्रवाई को लागू नहीं करता है।रेल 3: नया नेस्टेड संसाधन कैसे बनाएं?

class Book < ActiveRecord::Base 
    has_many :chapters 
end 

class Chapter < ActiveRecord::Base 
    belongs_to :book 
end 

मेरी मार्गों में दायर:

resources :books do 
    resources :chapters 
end 

अब मैं अध्याय नियंत्रक की 'नई' कार्रवाई को लागू करना चाहते हैं:

अपने आवेदन में, मैं एक किताब मॉडल कई अध्याय हैं कि है
class ChaptersController < ApplicationController 
    respond_to :html, :xml, :json 

    # /books/1/chapters/new 
    def new 
    @chapter = # this is where I'm stuck 
    respond_with(@chapter) 
    end 

ऐसा करने का सही तरीका क्या है? साथ ही, दृश्य स्क्रिप्ट (फॉर्म) कैसा दिखना चाहिए?

उत्तर

119

सबसे पहले आपको अपने अध्याय नियंत्रक में संबंधित पुस्तक को उसके लिए एक अध्याय बनाने के लिए मिलना होगा। आप इस तरह अपने कार्यों कर सकते हैं:

class ChaptersController < ApplicationController 
    respond_to :html, :xml, :json 

    # /books/1/chapters/new 
    def new 
    @book = Book.find(params[:book_id]) 
    @chapter = @book.chapters.build 
    respond_with(@chapter) 
    end 

    def create 
    @book = Book.find(params[:book_id]) 
    @chapter = @book.chapters.build(params[:chapter]) 
    if @chapter.save 
    ... 
    end 
    end 
end 

अपने रूप में, new.html.erb

form_for(@chapter, :url=>book_chapters_path(@book)) do 
    .....rest is the same... 

या आप एक आशुलिपि

form_for([@book,@chapter]) do 
    ...same... 

आशा इस मदद करता है की कोशिश कर सकते हैं।

+4

कोड को दोबारा करने के लिए - कोई भी पुस्तक @book = Book.find (पैराम्स [: book_id]) खोजने के लिए get_book विधि का उपयोग कर सकता है और फिर इस विधि को पहले फ़िल्टर के रूप में उपयोग कर सकता है। ऐसा इसलिए है क्योंकि अध्याय नियंत्रक में आपके द्वारा लागू की जाने वाली किसी भी विधि को उस पुस्तक ऑब्जेक्ट की आवश्यकता होगी, जिसका वह संबंधित है। – Ninad

+0

पुन: उपर्युक्त टिप्पणी, यदि आपके पास पुस्तक के कई बच्चे थे, तो आप 'बुक_ल्पर' विधि में 'get_book' विधि को दोबारा बुक करें और 'बुकशेल्पर' को अपनी पुस्तक नियंत्रक और पुस्तकें संबंधित नियंत्रकों में दोबारा शामिल करेंगे। – ocodo

+0

यह डीबी के लिए एक अतिरिक्त चयन क्वेरी नहीं बना है? –

6

@chapter = @book.build_chapter आज़माएं। जब आप @book.chapter पर कॉल करते हैं, तो यह शून्य है। आप nil.new नहीं कर सकते हैं।

EDIT: मुझे अभी एहसास हुआ कि पुस्तक में सबसे अधिक संभावना है Imany अध्याय ... उपरोक्त है_ऑन के लिए है। आपको @chapter = @book.chapters.build का उपयोग करना चाहिए। अध्याय "रिक्त सरणी" वास्तव में एक विशेष वस्तु है जो नए संगठनों को जोड़ने के लिए build पर प्रतिक्रिया देती है।

1

शायद असंबंधित है, लेकिन इस प्रश्न के शीर्षक से आप यहां कुछ अलग तरीके से कुछ करने के लिए देख सकते हैं।

चलें कहते हैं कि तुम Book.new(name: 'FooBar', author: 'SO') करना चाहते हैं और आप एक अलग मॉडल में कुछ मेटाडेटा विभाजित करना चाहते हैं, कई मॉडल के लिए readable_config जो बहुरूपी है और दुकानों name और author कहा जाता है।

कैसे आप Book.new(name: 'FooBar', author: 'SO') स्वीकार करते हैं Book मॉडल है और यह भी readable_config मॉडल का निर्माण करने के

इस रूप में ऐसा किया जा सकता है (जो मैं, शायद गलती से एक 'नेस्ट संसाधन' कहेंगे):

class Book < ActiveRecord::Base 
    has_one :readable_config, dependent: :destroy, autosave: true, validate: true 
    delegate: :name, :name=, :author, :author=, :to => :readable_config 

    def readable_config 
    super ? super : build_readable_config 
    end 
end 
+0

काफी आश्चर्यजनक, मुझे इस समाधान से प्यार है, धन्यवाद! – sidney

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