Ruby on Rails 5.2 - ActionDispatch::Routing::Mapper::Resources

मॉड्यूल ActionDispatch :: रूटिंग :: मैपर :: संसाधन




ruby

मॉड्यूल ActionDispatch :: रूटिंग :: मैपर :: संसाधन

संसाधन मार्ग आपको किसी दिए गए संसाधन नियंत्रक के लिए सभी सामान्य मार्गों को जल्दी से घोषित करने की अनुमति देता है। अपने index लिए अलग-अलग मार्गों की घोषणा करने के बजाय, show , new , edit , create , update और कार्यों destroy करें, एक संसाधन मार्ग उन्हें कोड की एक पंक्ति में घोषित करता है:

resources :photos

कभी-कभी, आपके पास एक संसाधन होता है जो क्लाइंट हमेशा एक आईडी को संदर्भित किए बिना देखते हैं। एक सामान्य उदाहरण, / प्रोफ़ाइल हमेशा उपयोगकर्ता में वर्तमान में लॉग की गई प्रोफ़ाइल दिखाता है। इस स्थिति में, आप शो कार्रवाई के लिए मैप / प्रोफाइल (बजाय / प्रोफाइल /: आईडी) के एक विलक्षण संसाधन का उपयोग कर सकते हैं।

resource :profile

ऐसे संसाधन होना आम है जो तार्किक रूप से अन्य संसाधनों के बच्चे हैं:

resources :magazines do
  resources :ads
end

आप एक नाम स्थान के तहत नियंत्रकों के समूह को व्यवस्थित करना चाह सकते हैं। आमतौर पर, आप एक admin नामस्थान के अंतर्गत कई प्रशासनिक नियंत्रकों का समूह बना सकते हैं। आप app/controllers/admin निर्देशिका के तहत इन नियंत्रकों को रखेंगे, और आप उन्हें अपने राउटर में एक साथ समूहित कर सकते हैं:

namespace "admin" do
  resources :posts, :comments
end

डिफ़ॉल्ट रूप से :id पैरामीटर डॉट्स स्वीकार नहीं करता है। यदि आपको डॉट्स के भाग के रूप में उपयोग करने की आवश्यकता है :id पैरामीटर एक बाधा जोड़ता है जो इस प्रतिबंध को खत्म करता है, जैसे:

resources :articles, id: /[^\/]+/

यह आपके स्लैश :id भाग के अलावा किसी भी वर्ण को अनुमति देता है।

स्थिरांक

CANONICAL_ACTIONS
RESOURCE_OPTIONS
VALID_ON_OPTIONS

CANONICAL_ACTIONS सभी कार्यवाहियां रखती हैं, जिनमें किसी उपसर्ग या पथ की आवश्यकता नहीं होती है क्योंकि वे अपने कार्यक्षेत्र स्तर में ठीक से फिट होते हैं।

सार्वजनिक प्रवृत्ति के तरीके

संग्रह () {|| ...} स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 1483
def collection
  unless resource_scope?
    raise ArgumentError, "can't use collection outside resource(s) scope"
  end

  with_scope_level(:collection) do
    path_scope(parent_resource.collection_scope) do
      yield
    end
  end
end

संग्रह में एक मार्ग जोड़ने के लिए:

resources :photos do
  collection do
    get 'search'
  end
end

यह रेल्स को पथ /photos/search GET के साथ /photos/search , और PhotosController की खोज कार्रवाई के लिए मार्ग को पहचानने में सक्षम करेगा। यह search_photos_url और search_photos_path मार्ग सहायक भी बनाएगा।

मैच (पथ, * बाकी, और ब्लॉक) दिखाएँ स्रोत
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 1580
def match(path, *rest, &block)
  if rest.empty? && Hash === path
    options  = path
    path, to = options.find { |name, _value| name.is_a?(String) }

    raise ArgumentError, "Route path not specified" if path.nil?

    case to
    when Symbol
      options[:action] = to
    when String
      if to =~ /#/
        options[:to] = to
      else
        options[:controller] = to
      end
    else
      options[:to] = to
    end

    options.delete(path)
    paths = [path]
  else
    options = rest.pop || {}
    paths = [path] + rest
  end

  if options.key?(:defaults)
    defaults(options.delete(:defaults)) { map_match(paths, options, &block) }
  else
    map_match(paths, options, &block)
  end
end

एक या अधिक मार्गों के लिए URL पैटर्न से मेल खाता है। अधिक जानकारी के लिए, देखें match

match 'path' => 'controller#action', via: :patch
match 'path', to: 'controller#action', via: :post
match 'path', 'otherpath', on: :member, via: :get
सदस्य () {|| ...} स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 1506
def member
  unless resource_scope?
    raise ArgumentError, "can't use member outside resource(s) scope"
  end

  with_scope_level(:member) do
    if shallow?
      shallow_scope {
        path_scope(parent_resource.member_scope) { yield }
      }
    else
      path_scope(parent_resource.member_scope) { yield }
    end
  end
end

सदस्य मार्ग जोड़ने के लिए, संसाधन ब्लॉक में सदस्य ब्लॉक जोड़ें:

resources :photos do
  member do
    get 'preview'
  end
end

यह GET के साथ /photos/1/preview को पहचानेगा और PhotosController के प्रीव्यू एक्शन को रूट करेगा। यह preview_photo_url और preview_photo_path मददगार भी बनाएगा।

नाम स्थान (पथ, विकल्प = {}) स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 1555
def namespace(path, options = {})
  if resource_scope?
    nested { super }
  else
    super
  end
end

देखें ActionDispatch::Routing::Mapper::Scoping#namespace

सुपरक्लास विधि कहता है
नेस्टेड () {|| ...} स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 1534
def nested
  unless resource_scope?
    raise ArgumentError, "can't use nested outside resource(s) scope"
  end

  with_scope_level(:nested) do
    if shallow? && shallow_nesting_depth >= 1
      shallow_scope do
        path_scope(parent_resource.nested_scope) do
          scope(nested_options) { yield }
        end
      end
    else
      path_scope(parent_resource.nested_scope) do
        scope(nested_options) { yield }
      end
    end
  end
end
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 1522
def new
  unless resource_scope?
    raise ArgumentError, "can't use new outside resource(s) scope"
  end

  with_scope_level(:new) do
    path_scope(parent_resource.new_scope(action_path(:new))) do
      yield
    end
  end
end
संसाधन (* संसाधन) {|| ...} स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 1280
def resource(*resources, &block)
  options = resources.extract_options!.dup

  if apply_common_behavior_for(:resource, resources, options, &block)
    return self
  end

  with_scope_level(:resource) do
    options = apply_action_options options
    resource_scope(SingletonResource.new(resources.pop, api_only?, @scope[:shallow], options)) do
      yield if block_given?

      concerns(options[:concerns]) if options[:concerns]

      new do
        get :new
      end if parent_resource.actions.include?(:new)

      set_member_mappings_for_resource

      collection do
        post :create
      end if parent_resource.actions.include?(:create)
    end
  end

  self
end

कभी-कभी, आपके पास एक संसाधन होता है जो क्लाइंट हमेशा एक आईडी को संदर्भित किए बिना देखते हैं। एक सामान्य उदाहरण, / प्रोफ़ाइल हमेशा उपयोगकर्ता में वर्तमान में लॉग की गई प्रोफ़ाइल दिखाता है। इस स्थिति में, आप शो कार्रवाई के लिए मानचित्र / प्रोफ़ाइल (बजाय / प्रोफ़ाइल /: आईडी) के लिए एक विलक्षण संसाधन का उपयोग कर सकते हैं:

resource :profile

यह आपके एप्लिकेशन में छह अलग-अलग मार्ग बनाता है, सभी Profiles कंट्रोलर (ध्यान दें कि कंट्रोलर का नाम बहुवचन के नाम पर है):

GET       /profile/new
GET       /profile
GET       /profile/edit
PATCH/PUT /profile
DELETE    /profile
POST      /profile

विकल्प

resources समान विकल्प लेता है

संसाधनों (* संसाधन) {|| ...} स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 1441
def resources(*resources, &block)
  options = resources.extract_options!.dup

  if apply_common_behavior_for(:resources, resources, options, &block)
    return self
  end

  with_scope_level(:resources) do
    options = apply_action_options options
    resource_scope(Resource.new(resources.pop, api_only?, @scope[:shallow], options)) do
      yield if block_given?

      concerns(options[:concerns]) if options[:concerns]

      collection do
        get  :index if parent_resource.actions.include?(:index)
        post :create if parent_resource.actions.include?(:create)
      end

      new do
        get :new
      end if parent_resource.actions.include?(:new)

      set_member_mappings_for_resource
    end
  end

  self
end

रेल में, एक संसाधन मार्ग HTTP क्रिया और URL और नियंत्रक क्रियाओं के बीच एक मानचित्रण प्रदान करता है। अधिवेशन द्वारा, प्रत्येक क्रिया एक डेटाबेस में विशेष रूप से CRUD संचालन के लिए मैप करती है। रूटिंग फ़ाइल में एक एकल प्रविष्टि, जैसे

resources :photos

आपके एप्लिकेशन में सात अलग-अलग मार्ग बनाता है, सभी Photos नियंत्रक के लिए मैपिंग:

GET       /photos
GET       /photos/new
POST      /photos
GET       /photos/:id
GET       /photos/:id/edit
PATCH/PUT /photos/:id
DELETE    /photos/:id

इस ब्लॉक सिंटैक्स का उपयोग करके Resources को असीम रूप से घोंसला बनाया जा सकता है:

resources :photos do
  resources :comments
end

यह निम्नलिखित टिप्पणियाँ मार्ग उत्पन्न करता है:

GET       /photos/:photo_id/comments
GET       /photos/:photo_id/comments/new
POST      /photos/:photo_id/comments
GET       /photos/:photo_id/comments/:id
GET       /photos/:photo_id/comments/:id/edit
PATCH/PUT /photos/:photo_id/comments/:id
DELETE    /photos/:photo_id/comments/:id

विकल्प

match साथ ही विकल्प भी लेता है:

: path_names

आपको edit और new कार्यों के खंड घटक को बदलने की अनुमति देता है। निर्दिष्ट किए गए कार्य नहीं बदले गए हैं।

resources :posts, path_names: { new: "brand_new" }

उपरोक्त उदाहरण अब / पोस्ट / नए / / पोस्ट / brand_new में बदल जाएगा।

: पथ

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

resources :posts, path: 'postings'

संसाधन और सभी खंड अब / पोस्ट के बजाय / पोस्टिंग के लिए रूट होंगे।

:केवल

केवल दिए गए कार्यों के लिए मार्ग उत्पन्न करते हैं।

resources :cows, only: :show
resources :cows, only: [:show, :index]
:के सिवाय

दिए गए कार्यों को छोड़कर सभी मार्गों को उत्पन्न करें।

resources :cows, except: :show
resources :cows, except: [:show, :index]
: उथले

नेस्टेड संसाधन के लिए उथले मार्ग उत्पन्न करता है। जब मूल संसाधन पर रखा जाता है, तो सभी नेस्टेड संसाधनों के लिए उथले मार्ग उत्पन्न करता है।

resources :posts, shallow: true do
  resources :comments
end

के समान है:

resources :posts do
  resources :comments, except: [:show, :edit, :update, :destroy]
end
resources :comments, only: [:show, :edit, :update, :destroy]

यह उन संसाधनों के लिए URLs की अनुमति देता है, जो अन्यथा ब्लॉग पोस्ट /posts/a-long-permalink/comments/1234 जैसे किसी टिप्पणी पर केवल /comments/1234 लिए संक्षिप्त करने के लिए गहरा नेस्टेड होंगे।

: shallow_path

निर्दिष्ट मार्ग के साथ उथले मार्गों को उपसर्ग करता है।

scope shallow_path: "sekret" do
  resources :posts do
    resources :comments, shallow: true
  end
end

यहाँ comments संसाधन में इसके लिए उत्पन्न निम्नलिखित मार्ग होंगे:

post_comments    GET       /posts/:post_id/comments(.:format)
post_comments    POST      /posts/:post_id/comments(.:format)
new_post_comment GET       /posts/:post_id/comments/new(.:format)
edit_comment     GET       /sekret/comments/:id/edit(.:format)
comment          GET       /sekret/comments/:id(.:format)
comment          PATCH/PUT /sekret/comments/:id(.:format)
comment          DELETE    /sekret/comments/:id(.:format)
: shallow_prefix

उपसर्ग ने निर्दिष्ट उपसर्ग के साथ उथले मार्ग नामों का उल्लेख किया है।

scope shallow_prefix: "sekret" do
  resources :posts do
    resources :comments, shallow: true
  end
end

यहाँ comments संसाधन में इसके लिए उत्पन्न निम्नलिखित मार्ग होंगे:

post_comments           GET       /posts/:post_id/comments(.:format)
post_comments           POST      /posts/:post_id/comments(.:format)
new_post_comment        GET       /posts/:post_id/comments/new(.:format)
edit_sekret_comment     GET       /comments/:id/edit(.:format)
sekret_comment          GET       /comments/:id(.:format)
sekret_comment          PATCH/PUT /comments/:id(.:format)
sekret_comment          DELETE    /comments/:id(.:format)
: प्रारूप

आपको वैकल्पिक format खंड के लिए डिफ़ॉल्ट मान निर्दिष्ट करने या false आपूर्ति करके इसे अक्षम करने की अनुमति देता है।

उदाहरण

# routes call <tt>Admin::PostsController</tt>
resources :posts, module: "admin"

# resource actions are at /admin/posts.
resources :posts, path: "admin/posts"
resource_path_names (विकल्प) स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 1255
def resources_path_names(options)
  @scope[:path_names].merge!(options)
end
root (पथ, विकल्प = {}) स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 1627
def root(path, options = {})
  if path.is_a?(String)
    options[:to] = path
  elsif path.is_a?(Hash) && options.empty?
    options = path
  else
    raise ArgumentError, "must be called with a path and/or options"
  end

  if @scope.resources?
    with_scope_level(:root) do
      path_scope(parent_resource.path) do
        match_root_route(options)
      end
    end
  else
    match_root_route(options)
  end
end

आप निर्दिष्ट कर सकते हैं कि रेल को रूट विधि के साथ "/" क्या रूट करना चाहिए:

root to: 'pages#main'

विकल्पों के लिए, match देखें, क्योंकि root आंतरिक रूप से इसका उपयोग करता है।

आप एक स्ट्रिंग भी पास कर सकते हैं जो विस्तार करेगा

root 'pages#main'

आपको रूट रूट को config/routes.rb मार्गों के शीर्ष पर रखना चाहिए। config/routes.rb , क्योंकि इसका मतलब है कि यह पहले से मेल config/routes.rb । चूंकि यह अधिकांश रेल अनुप्रयोगों का सबसे लोकप्रिय मार्ग है, इसलिए यह फायदेमंद है।

उथला () {|| ...} स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 1563
def shallow
  @scope = @scope.new(shallow: true)
  yield
ensure
  @scope = @scope.parent
end
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 1570
def shallow?
  !parent_resource.singleton? && @scope[:shallow]
end

निजी उदाहरण तरीके

# File actionpack/lib/action_dispatch/routing/mapper.rb, line 1827
def api_only? # :doc:
  @set.api_only?
end
set_member_mappings_for_resource () स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 1815
def set_member_mappings_for_resource # :doc:
  member do
    get :edit if parent_resource.actions.include?(:edit)
    get :show if parent_resource.actions.include?(:show)
    if parent_resource.actions.include?(:update)
      patch :update
      put   :update
    end
    delete :destroy if parent_resource.actions.include?(:destroy)
  end
end
with_scope_level (दयालु) {|| ...} स्रोत दिखाएं
# File actionpack/lib/action_dispatch/routing/mapper.rb, line 1711
def with_scope_level(kind) # :doc:
  @scope = @scope.new_level(kind)
  yield
ensure
  @scope = @scope.parent
end