2012-06-17 10 views
6

Ich habe eine wirklich schwierige Zeit zu verstehen Routen und ich hoffe, jemand kann mir helfen.Schienen: Route zu benutzerdefinierten Controller Aktion

Hier ist meine benutzerdefinierte Controller

class SettingsController < ApplicationController 
    before_filter :authenticate_user! 

    def edit 
     @user = current_user 
    end 

    def update 
     @user = User.find(current_user.id) 
     if @user.update_attributes(params[:user]) 
     # Sign in the user bypassing validation in case his password changed 
     sign_in @user, :bypass => true 
     redirect_to root_path 
     else 
     render "edit" 
     end 
    end 
end 

und ich habe die Datei Einstellungen/edit.html.erb und meine Verbindung

<li><%= link_to('Settings', edit_settings_path) %></li> 

Die Route

get "settings/edit" 

funktioniert nicht dafür, denn dann bekomme ich

undefined local variable or method `edit_settings_path' for #<#<Class:0x00000001814ad8>:0x00000002b40a80> 

Welchen Weg muss ich diesem geben? Ich kann es nicht herausfinden. Wenn ich „/ Einstellungen/bearbeiten“ anstelle eines Pfades setzen vermasselt es, sobald ich auf einer anderen Ressource Seite bin, weil der Ressourcenname, bevor die Einstellungen bearbeiten/gesetzt wird

Thx

+0

sagen Sie uns zuerst welche Routen haben Sie ausprobiert – rubish

+0

bearbeitet meine Frage – Mexxer

Antwort

16

Folgende tun sollten:

get 'settings/edit' => 'settings#edit', :as => :edit_settings 
# you can change put to post as you see fit 
put 'settings/edit' => 'settings#update' 

Wenn Sie /settings/edit direkt in Verbindung verwenden, sollten Sie nicht mit anderen Ressourcennamen haben Problem in Pfad vorangestellt werden. Ohne den führenden Schrägstrich, d. H. settings/edit, könnte dieses Problem auftreten.

Grund warum edit_settings_path funktioniert möglicherweise nicht, weil Sie eine benannte Route nicht deklariert haben. Sie müssen :as Option verwenden, um zu definieren, nach welcher Methode Sie diesen Pfad/URL generieren werden.

+0

Vielen Dank! Ich habe wirklich das/davor vergessen. Am Ende habe ich deine Lösung benutzt :) – Mexxer

4

Wenn Sie die Route explizit definieren, würden Sie so etwas wie

get 'settings/edit' => 'settings#edit', :as => edit_settings 

Diese Anweisung definiert, dass verwenden, wenn eine GET-Anforderung für Einstellung bearbeiten/empfangen wird, rufen Sie die SettingsController # bearbeiten Methode, und dass die Ansichten kann mit 'edit_settings_path' auf diesen Link verweisen.

Nehmen Sie sich etwas Zeit zum Lesen the Rails guide on routing. Es erklärt Routing besser als jede andere Referenz da draußen.

Beachten Sie auch die Aufgabe rake routes, in der die Details aller in Ihrer Anwendung definierten Routen aufgeführt sind.

1

Ihre Route ändern zu

resources :settings 

Und es wird wahrscheinlich nur funktionieren.

Verwandte Themen