Versuche, URLs der Form / boards / in Ruby auf Rails zu bringen und Fehler zu bekommen - Ruby-on-Rails, Ruby, Rest

Ich verwende Ruby on Rails, um eine einfache Social-Networking-Site zu erstellen, die verschiedene Message Boards für jedes Komitee einer Studentengruppe enthält. Ich möchte, dass die URL-Struktur für jedes Board aussieht https://<base_url>/boards/<committee_name> und dies bringt den Benutzer zum Forum für dieses Komitee.

Meine routes.rb-Datei sieht folgendermaßen aus:

resources :committees, only: [:index]
match "/boards/:name", to: "committees#index(name)"

Meine Indexfunktion der Datei commits_controller.rb sieht folgendermaßen aus:

def index(name)
@posts = Committee.where(name: name)
end

Und dann werde ich das benutzen @posts Variable auf der Seite, um alle Beiträge anzuzeigen, aber gerade jetzt, wenn ich zu navigieren https://<base_url>/boards/<committee_name> Ich bekomme einen Unbekannten Aktionsfehler, und es heißt The action "index(name)" could not be found for CommitteesController.

Könnte mich jemand durch das führen, was ich falsch gemacht habe?

Sobald ich das funktioniert habe, wie würde ich eine Ansicht machen, die diese URL-Struktur widerspiegelt?

Antworten:

1 für die Antwort № 1

Richte deine Routen so ein:

resources :committees, only: [:index]
match "/boards/:name", to: "committees#show"

und der Controller so:

def index
@committees = Committee.all
end

def show
@committee = Committee.find_by_name!(params[:name])
end

Sie können Argumente nicht so an Controller-Aktionen übergeben, wie Sie es versuchten index(name). Stattdessen verwenden Sie die params Hash, den Rails Ihnen bietet. Das :name Ein Teil der Route-Deklaration weist Rails an, die Übereinstimmungen dort einzugeben params[:name].

Sie sollten auch separate Aktionen für die Auflistung von Ausschüssen und die Anzeige einzelner Ausschüsse verwenden. Nach Rails-Konventionen sollten diese die sein index und show Aktionen jeweils.


0 für die Antwort № 2

Beim Routing geben Sie nur den Methodennamen und nicht die Argumente an:

match "/boards/:name", to: "committees#show"

Generell erklärst du etwas mit resources oder match aber nicht beide. Um REST-ful zu bleiben, sollte dies das sein show Methode. Index ist ein collection Methode, in der Regel keine Art von Datensatz-Kennung.

Argumente kommen immer über die params Struktur:

def show
@posts = Committee.where(name: params[:name])
end

Controller-Methoden, die über Routen verfügbar sind, benötigen keine Argumente. Sie können konstruieren private Methoden, die Argumente für andere Zwecke verwenden.


Speisekarte