3 Stimmen

Rails routing verschachtelte Ressourcen doppelt

Ich möchte unterstützen:

POST images/1/comments/2/like

und

POST comments/2/like

Sie beide verweisen auf die gleichen Ressourcen mit der gleichen Aktion. Wie kann ich das in der Rails-Routendatei tun?

resources :images do
    resources :comments do
      member do
        post 'like'
      end
    end
  end

Dies wird funktionieren für

POST images/1/comments/2/like

aber wie kann ich es auch machen, wenn ich den images/1 Teil nicht angebe?

2voto

frbl Punkte 1020

Sie können es tatsächlich schöner machen. Laut http://ruby-journal.com/how-to-dry-your-rails-routes/ funktioniert auch dies:

comments = Proc.new do
  member do
    post 'like'
  end
end

resources :comments, &comments

resources :images do
  comments.call
end

und in Rails 4 könnten Sie concerns verwenden

concern :comments_concern do
  member do
    post 'like'
  end
end

resources :comments, concerns: :comments_concern

resources :images, concerns: :comments_concern do
  #mehr Dinge hier tun
end

Ich habe das nicht getestet, aber es könnte hilfreich sein. Schauen Sie sich die erwähnte Website an. Viel Glück

-frbl

1voto

zeantsoi Punkte 25107

Ich würde in Betracht ziehen, die RESTful-Routen für Comment zu überarbeiten, die Du verschachtelst, und welche nicht. Ich gehe davon aus, dass Deine Modelle ungefähr so aussehen:

# app/models/image.rb
class Image < ActiveRecord::Base
    has_many :comments
end

# app/models/comment.rb
class Comment < ActiveRecord::Base
    belongs_to :image
end

Weil Deine Image und Comment Modelle eine Beziehung eins zu vielen besitzen, kann ich verstehen, warum Du denkst, die Routen für Kommentare innerhalb der Bilder-Routen zu verschachteln. Allerdings erfordert im comments_controller.rb von allen CRUD-Aktionen nur create tatsächlich, dass explizit eine Eltern-Image-ID übergeben wird. Aus einer RESTful-Perspektive erfordern nur die Aktionen new und create, dass eine image_id an die Aktion übergeben wird. Die Aktionen edit, update, delete und like können unabhängig vom Elternbild stattfinden.

Betrachte stattdessen das alternative Routing-Schema:

# config/routes.rb
resources :images do
  resources :comments, :only => [:index, :new, :create]
end

resources :comments, :only => [:show, :edit, :update, :destroy] do
  member do
    post 'like'

Jetzt sind nur die Kommentaraktionen die explizit von einer Eltern-ID abhängig sind tatsächlich innerhalb der Bilder-Routen verschachtelt. Die restlichen Kommentaraktionen werden direkt an den Kommentar-Controller geroutet, ohne die Eltern-ID zu übergeben. Deine Routen sind nicht mehr dupliziert, und für jede Aktion wird genau eine Route dafür deklariert.

0voto

Ganesh Kunwar Punkte 2643

Einfach Ressourcen: Bilder hinzufügen, es könnte funktionieren

0voto

Heartcroft Punkte 1652

Nicht sicher, ob es einen schöneren Weg gibt, als dies unten zu wiederholen:

resources :comments do
  member do
    post 'like'

So:

resources :images do
  resources :comments do
    member do
      post 'like'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X