2011-01-11 13 views
1

Ich denke, das sollte eine einfache Sache sein, um herauszufinden, aber ich bin ratlos.Wie man einen Parameter von einer Ansicht zur anderen in Ruby on Rails übergibt, mit POST

Ich habe einen Wert in einer Instanzvariablen des Projekts namens ID. Ich möchte diesen Wert an eine neue Fotos-Seite übergeben, um jedes Foto, das mit diesem bestimmten Projekt erstellt wurde, zuzuordnen, aber ich möchte nicht, dass die ID des Projekts in der sichtbaren Abfragezeichenfolge angezeigt wird.

Ich habe versucht, mit link_to und button_to, aber (ich vermute), da ich "Ressourcen: Fotos" in meinen Routen verwenden, alle Anfragen, die zu Foto # neu kommen, werden als GET anstelle von POST interpretiert .

Helllllllllllllllp!

Danke an jeden, der mir einen Einblick geben kann, ich habe mich schon in den letzten ein oder zwei Stunden umgebracht.

--Mark

Antwort

1

Der üblicher Weg, dies in Rails zu tun ist, um eine Route zu erstellen, die URLs wie diese Spiele: /projects/4/photos/new. Etwas anderes zu tun liegt ganz bei Ihnen, aber Rails macht es wirklich einfach, so etwas zu tun. Sehen Sie mehr auf routes in Rails 3.

Ihr Eintrag in routes.rb soll wie folgt aussehen:

def new 
    @project = Project.find_by_id(params[:project_id]) 
end 

und dies für die Aktion:

resources :projects do 
    resources :photos 
end 

Dann in app/controllers/photos_controller.rb Sie dies für die "New Photo" Formularseite haben würden dass das Formular in app/views/photos/new.html.erb übergibt an:

def create 
    @project = Project.find_by_id(params[:project_id]) 
    @photo = @project.photos.create(params[:photo]) 
end 

Natürlich wollen Sie hier Fehlerbehandlung und -validierung haben, aber das ist der Kern davon. Und denken Sie daran, verwenden GET für idempotent (nicht staatlich Wechsel) Aktionen (z GET /projects/4/photos), POST für eine neue Sache zu schaffen (zum Beispiel POST /projects/4/photos) und PUT für die Aktualisierung eine bestehende Sache (z PUT /projects/4/photos/8).

+0

Danke Brian. Ich habe versucht, herauszufinden, wie man das über den POST macht, weil ich nicht wollte, dass der Benutzer die Adressleiste leicht bearbeiten und in einem anderen Projekt landen kann. Ich denke, es gibt keine Möglichkeit, das zu tun. Danke noch einmal! – Mark

+0

Sie können es mit einem versteckten '' tun, aber ich würde es nicht empfehlen. Gibt es noch einen weiteren Grund dafür, die URL nicht für die Zugriffskontrolle bearbeiten zu lassen? Weil Sie das im Controller überprüfen sollten. Wenn Sie nicht möchten, dass sie die ID kennen, können Sie für jedes Projekt eine undurchsichtige, zufällige Kennung (z. B. q8jfa2) generieren. In beiden Fällen kann ein bestimmter Benutzer entweder die URL oder das DOM bearbeiten, um das Projekt zu ändern. Stellen Sie daher sicher, dass Sie überprüfen, was auf dem Server benötigt wird. –

+0

Sicher, ich habe es. Haben Sie Vorschläge, wie Sie den Zugriff auf die Erstellung neuer Fotos auf einen Benutzer beschränken können, der mit einem bestimmten Projekt verknüpft ist? Ich benutze Devise/CanCan, wenn das hilft ... – Mark

Verwandte Themen