Problemi viste - controller

Salve,
avrei un problema con una vista (eventi.erb.html) e la funzione (eventi)
assocciata nel controller. In pratica tramite un link cerco di accedere
alla vista suddetta solo che una volta cliccato sul link mi da errore di
oggetto vuoto riferendosi al metodo show(del controller user) e non a
quello eventi.

class UsersController < ApplicationController


#Parte relativa agli eventi dell’utente
def eventi
@user = User.find(:first, :conditions =>[“id = ?”,
session[:user_id]])
end

end

codice del link
<%= link_to(“MyEvent”, :controller => “Users”, :action => “eventi”) %>

e questo è l’errore che mi riporta

ActiveRecord::RecordNotFound in UsersController#show
Couldn’t find User with ID=eventi

E’ evidente che non viene presa in considerazione l’azione eventi.
Controlla il file routes.rb. Se users è gestito come risorsa, allora
devi usare le azioni REST o definire esplicitamente le altre azioni.
Se non è definito come risorsa, allora entrano in gioco le ultime due
righe del file routes.rb (attive di default).

Alessandro P. ha scritto:

Grazie della risposta ma ho cercato un po di documentazione sulle azioni
REST ma non ho capito come definire esplicitamente le altre azioni… il
mio file routes.rb è il seguente

ActionController::Routing::Routes.draw do |map|
map.resources :towns

map.resources :events

map.resources :users

Install the default routes as the lowest priority.

map.connect ‘:controller/:action/:id’
map.connect ‘:controller/:action/:id.:format’

end

Scusatemi se le mie domande sono un po “sempliciotte” ma sono un niubbo
e non riesco ancora a muovermi bene in rails.

Ti ringrazio tantissimo per la velocità di risposta e la completezza,
ora provo ad usare la soluzione da te proposta e a documentarmi meglio.
Grazie ancora :slight_smile:

end

Scusatemi se le mie domande sono un po “sempliciotte” ma sono un niubbo
e non riesco ancora a muovermi bene in rails.

Non ci sono domande banali, quindi vai tranquillissimo.

Provo a spiegarti la storia un attimo. Quando utilizzi il comando
map.resources all’interno di routes ti crea di default una serie di
named
routes per ogni controller, in modo da poter gestire la tua applicazione
in
modo RESTful.

Prendendo in considerazione map.resources :users devi sapere che tra
tutte
ti crea (in automatico) la named route per accedere all’azione show così
definita:

map.device “/users/:id”, :action => “show”, :conditions => { :method =>
:get
}

Ora tutte le chiamate che tu fai e che matchano questo pattern ti
porteranno
sempre all’azione show del controller users. Nel tuo caso chiamando
l’azione
eventi generi il link /users/event che matcha con la named route per
accedere a show. Infatti prende users come controller ed event come id
(lo
vedi anche dal messaggio di errore)

La soluzione è usare l’opzione member su map.resources dicendogli che hai
un
nuovo metodo. Quindi modifica map.resources :users come segue (non l’ho
testato).

map.resources :users, :member => {:event => :get}

Questo potrebbe suonarti un pochino complesso, lo so, perchè devi gestire
ogni metodo extra, ma ti forza a seguire the rails way. In poche parole
non
dovresti mai aver bisogno di nuovi metodi (se non raramente) oltre ai 7
standard. Se ci sono ti consigliano di creare un nuovo controller. Non
vale
sempre, ma molte volte
è così.
Se ti interessa approfondire cerca “Restful routes customizations” o
leggi
il capitolo 4 del librone “The Rails Way” che spiega abbastanza bene
come
funziona il routing per RESTful Rails. Ci sono diversi aspetti che
è meglio
conoscere.

Buon lavoro!

Alla fine ho deciso di creare un controller account, risolvendo così il
mio problema e tra l’altro logicamente ha anche più senso. Ciao a tutti
e grazie ancora dell’aiuto