Problema indirizzamento controller-vista


#1

Ho messo in una vista:

<%= link_to ‘Visualizza’, :controller => :questions, :action => :arg %>

…e la relativa azione del controller risulta così:

def arg
@questions = Question.find_all_by_admin_id(session[:admin_id],:order
=> ‘pubblica asc, id asc’)

respond_to do |format|
format.html # arg.html.erb
format.xml { render :xml => @questions }
end
end

Non capisco perchè non mi funziona. L’azione index del controller è
implementata in modo identico, eppure quella funziona.
L’azione “arg” invece non funziona per niente.

Idee a riguardo ?

PS. L’errore che mi segnala è: “Couldn’t find Question with ID=arg”


#2

Ho notato che se al posto di link_to uso button_to funziona…
Qualcuno mi sa spiegare questo comportamento anomalo ?

Io comunque ho bisogno di usare un link_to, qualcuno sa come fare ?


#3

Ho capito che il problema non è nel link, ma nel controller:

def arg
@questions = Question.find(:all)

respond_to do |format|
format.html
format.xml { render :xml => @questions }
end
end

Perchè questa azione del controller non funziona ??
Eppure è identica all’azione index dello stesso controller (anche le
viste sono identiche).


#4

Che cosa è che non funziona?
Ricevi un errore? Che tipo di errore?
Che versione di Rails?

Isola la richiesta che ti da errore nei log e postala con tutto lo
stacktrace.

Il giorno 07/nov/08, alle ore 18:04, Davide S. ha scritto:


#5

Fabrizio R. wrote:

Che cosa � che non funziona?
Ricevi un errore? Che tipo di errore?
Che versione di Rails?

Rails versione 2.0.2
L’errore visualizzato dal browser è “Couldn’t find Question with
ID=arg”.

Isola la richiesta che ti da errore nei log e postala con tutto lo
stacktrace.

Non ho idea di cosa stai parlando, potresti essere più dettagliato ? Ho
appena iniziato con Ruby on Rails…


#6

Quando fai delle richieste nel browser, nella console vengono stampate
delle cose. Quello è il log, lo stesso che trovi in
log/development.log.
Copia e incolla nell’email la parte relativa alla chiamata che
genera l’errore.

così, a naso, direi che in routes.rb qualcosa non va.

Lancia il comando ‘rake routes’ e controlle che l’azione arg ci sia.
Se non c’è la devi impostare nel file routes.rb

2008/11/7 Davide S. removed_email_address@domain.invalid:


#7

Prova a cambiare la riga
map.resouces :questions

in

map.resources :questions, :collection => {:arg => :get}

2008/11/7 Fabrizio removed_email_address@domain.invalid:


#8

Ti metto quello che dice la console, perchè il file di log dice
tutt’altro:

127.0.0.1 - - [07/Nov/2008:19:22:03 ora solare Europa occidentale] “GET
/questions/arg HTTP/1.1” 404 11311

  • -> /questions/arg

Cos’è il file routes.rb ? Devo aggiornarlo ogni volta che creo una nuova
azione ?

Prova a cambiare la riga
map.resouces :questions

in

map.resources :questions, :collection => {:arg => :get}

Dove devo cambiarlo ?


#9

Altra cosa: perchè l’azione “index” non necessita di questa modifica e
funziona normalmente senza di essa ?


#10

Fabrizio wrote:

Prova a cambiare la riga
map.resouces :questions

in

map.resources :questions, :collection => {:arg => :get}

2008/11/7 Fabrizio removed_email_address@domain.invalid:

In questo modo funziona, ma qual è il significato del parametro
aggiuntivo ?
E poi, ogni volta che creo una nuova azione devo intervenire sul file
routes.rb ?


#11

Ciao Davide,
eccomi con le dovute spiegazioni.

Da una certa versione di rails in poi, (non ricordo quale) è stato
introdotto il concetto di ‘risorse’.
Se un controller è definito come ‘risorsa’, allora non puoi aggiungere
azioni liberamente come hai fatto con l’azione ‘arg’.
L’azione ‘index’ funzionava perchè rientra nelle azioni default delle
risorse.
La modifica la file routes.rb è necessaria quando, lavorando con una
risorsa, le azioni default non coprono i tuoi bisogni.

Iniziare lo sviluppo in Rails senza avere ben presente cosa sono le
risorse e cos’è il paradigma REST può essere alquanto doloroso.
Ti consiglio di iniziare da qui:
http://api.rubyonrails.org/classes/ActionController/Resources.html

Il giorno 07/nov/08, alle ore 19:47, Davide S. ha scritto: