Generar encuestas: Problemas rutas REST

Hola, estoy intentando realizar una serie de encuestas.Os comento un
poco los modelos:

Encuesta-> has_many :preguntas
Preguntas-> belongs_to :encuesta has_many :soluciones
Soluciones->belongs_to :pregunta

Siguiendo el tutorial de Jaime I. sobre las rutas REST me he creado
el siguiente esquema en mi routes.rb:

map.resources :encuestas do |encuesta|
map.resources :preguntas do |pregunta|
pregunta.resources :solucions
end
end

El problema que tengo es que al hacer rake routes, si me crea rutas REST
para preguntas y soluciones, pero no para encuestas. Me explico, las
rutas para encuesta son del tipo: new_encuesta GET /encuestas/new
Mientras que con preguntas y soluciones si puedo tener cosas como:
pregunta_solucions GET /preguntas/:pregunta_id/solucions

La curestion es que me gustaria tener rutas como
encuesta_pregunta_solucion pero es como si el primer map.resources, el
de encuesta se lo saltara. La version de Rails con la que estoy
trabajando es 2.1

Alguien puede decirme porqué falla? :frowning:

Saludos

Hola Jose, podrias indicarnos en que caso es util eso que necesitas?,
desde
mi punto de vista no es necesario saber nada acerca de la encuesta para
llegar a una solución, basta solamente con la pregunta.

Saludos.

2009/3/13 Jose vicente Ribera pellicer
[email protected]

map.resources :encuestas do |encuesta|
map.resources :preguntas do |pregunta|

este de arriba seria encuesta.resources :preguntas, sera por eso que no
lo toma?

pregunta.resources :solucions
end
end

Ricardo M.
http://www.gazer.com.ar/

Ricardo M. wrote:

2009/3/13 Jose vicente Ribera pellicer
[email protected]

map.resources :encuestas do |encuesta|
� �map.resources :preguntas do |pregunta|

este de arriba seria encuesta.resources :preguntas, sera por eso que no
lo toma?

� �pregunta.resources :solucions
� end
�end

Gracias, si que era por eso…El codigo queda asi:

map.resources :encuestas do |encuesta|
encuesta.resources :preguntas do |pregunta|
pregunta.resources :solucions
end
end

Ops!, vi mal tu mensaje, me parece que lo indica Ricardo es lo que
necesitas, yo me estaba refiriendo a otra cosa. Mil disculpas!

Ruben Davila wrote:

Hola Jose, podrias indicarnos en que caso es util eso que necesitas?,
desde
mi punto de vista no es necesario saber nada acerca de la encuesta para
llegar a una solución, basta solamente con la pregunta.

Saludos.

Utilizo REST para que las rutas sean mas comprensibles. Desde la url
tienes toda la informacion.Cuando muestres una solucion desde la ruta
sabes de que encuesta y de que pregunta se trata.

Tengo un problema, buno en veradd son dos os comento.
No consigo filtrar las pregun tas por encuestas, es decir pulse la
encuesta que pulse siempre me salen todas las preguntas. Para filtrar
las preguntas por encuestas tengo lo siguiente en el controlador de las
preguntas:

before_filter :find_encuesta# GET /preguntas

GET /preguntas.xml

def index
@preguntas = Pregunta.all(@encuesta) #(Para que liste todas las
preg de la encuesta en cuestion)

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

end

def find_encuesta #(localiza la encuesta antes de hacer anda con las
preguntas)
@encuesta = Encuesta.find(params[:encuesta_id])
end

En la vista del index de las encuestas tengo puesto un link en el titulo
para que me lleve a las preguntas de esa encuesta:

<%=link_to encuesta.titulo, encuesta_preguntas_path(encuesta) %>

Pues bien, no consigo entender porque no discrimina las preguntas por
encuestas :frowning:

Y la segunda duda es que en en el index de todas las preguntas tengo un
link en eltexto de estas para introducir las respuestas. Algo asi:

<%= link_to pregunta.texto, encuesta_pregunta_solucions_path(@encuesta, @pregunta) %>

Sin embargo laruta que saca el navegador es algo como esto:

http://localhost:3000/encuestas/2/preguntas//solucions

Como se puede observar, no aparece el id de la pregunta en cuestion, es
como si la pregunta no se pasara. :frowning:

Pues bien, no consigo entender porque no discrimina las preguntas por
encuestas :frowning:

Solucionado:
En el index de preguntas-> @[email protected]

Sigo mirando porque no pone la ruta bien cuando pincho en preguntas, eso
aun me falla.

Saludos

Manuel González Noriega wrote:

2009/3/14 Jose vicente Ribera pellicer
[email protected]

preg de la encuesta en cuestion)
Vamos a aprender a investigar ¿Qué crees que está haciendo esa última
línea?
y ¿qué está haciendo realmente, es decir, qué SQL se genera en el log?

Gracias por la aclaracion Manuel, Al hacer el Pregunta.all me sacaba por
pantalla todas las preguntas que tenia en la tabla para la encuesta en
cuestion. :wink:

2009/3/14 Jose vicente Ribera pellicer
[email protected]

preg de la encuesta en cuestion)
Vamos a aprender a investigar ¿Qué crees que está haciendo esa última
línea?
y ¿qué está haciendo realmente, es decir, qué SQL se genera en el log?

2009/3/14 Jose vicente Ribera pellicer
[email protected]

Gracias por la aclaracion Manuel, Al hacer el Pregunta.all me sacaba por
pantalla todas las preguntas que tenia en la tabla para la encuesta en
cuestion. :wink:

(Inserte su proverbio sobre cañas de pescar aquí)

Me alegro que lo hayas solucionado :slight_smile:

A la hora de encontar la pregunta en el controlador de soluciones creo
que le tendre que pasar el parametro de encuesta_id, ya que
tengo que especificar dentro de que encuesta me estoy moviendo. Queda
asi:

def find_encuesta_pregunta
pregunta=@pregunta=Pregunta.find(params[:encuesta_id],params[:pregunta_id])

end

En el create de solucios pongo esto:
def create
@solucion = Solucion.new(params[:solucion])

respond_to do |format|
  if @solucion.save
 @encuesta.pregunta.solucions << solucion

Para ir almacenando las soluciones dentro de las preguntas.

La verdad, no consigo ver el fallo, ni de esto ni de por que el enlace
que se genera al pinchar en las preguntas (que enlaza con el index de
las soluciones) no pone el id de la pregunta :frowning: :frowning:

2009/3/14 Jose vicente Ribera pellicer
[email protected]

undefined method `pregunta’ for #Encuesta:0x7f790af054d0

Bueno, cuando un método no está definido, lo primero que deberiamos
preguntarnos es ¿debería estarlo? Una encuesta supongo que tiene muchas
preguntas y por tanto existirá ‘preguntas’, no ‘pregunta’ ¿verdad?

Siguiendo el mismo razonamiento en el controlador de solucions tengo lo
siguiente:

before_filter :find_encuesta_pregunta

def index

@solucions = @encuesta.pregunta.solucions
respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @solucions }
end

end

def find_encuesta_pregunta
@encuesta=Encuesta.find(params[:encuesta_id])
pregunta=@pregunta=Pregunta.find(params[:pregunta_id])
end

El error que lanza es el siguiente:

NoMethodError in SolucionsController#index

undefined method `pregunta’ for #Encuesta:0x7f790af054d0

RAILS_ROOT: /home/jose/marzo
Application Trace | Framework Trace | Full Trace

/usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/attribute_methods.rb:260:in
method_missing' app/controllers/solucions_controller.rb:8:inindex’

Parameters:

{“encuesta_id”=>“1”,
“pregunta_id”=>“1”}

Bueno…decir que en el modelo de preguntas no tenia definido las
relaciones belongs has_many y asi mal ivamos.
Sigu sin generar la ruta con el id de preguntas, pero ahora si escribo a
mano:
http://localhost:3000/encuestas/1/preguntas/1/solucions

ya me muestra el index de soluciones. Ahora bien si le doy a new
solucion (tengo un link para ello en esta vista) aparece este mensaje:

encuesta_pregunta_solucion_url failed to generate from
{:controller=>“solucions”, :pregunta_id=>#<Pregunta id: 1, texto: “El
punto G se encuentra situado en la parte posteri…”, encuesta_id: 1,
orden: 2, created_at: “2009-03-13 21:00:22”, updated_at: “2009-03-13
21:00:22”>, :encuesta_id=>#<Encuesta id: 1, titulo: “Conocemos el punto
G”, description: “Todo el mundo habla del famoso punto G,…”,
created_at: “2009-03-13 18:14:01”, updated_at: “2009-03-13 18:14:01”>,
:action=>“show”}, expected: {:controller=>“solucions”, :action=>“show”},
diff: {:pregunta_id=>#<Pregunta id: 1, texto: “El punto G se encuentra
situado en la parte posteri…”, encuesta_id: 1, orden: 2, created_at:
“2009-03-13 21:00:22”, updated_at: “2009-03-13 21:00:22”>,
:encuesta_id=>#<Encuesta id: 1, titulo: “Conocemos el punto G”,
description: “Todo el mundo habla del famoso punto G,…”, created_at:
“2009-03-13 18:14:01”, updated_at: “2009-03-13 18:14:01”>}

Los parametros los coje bien, pero me llama la atencion esto
->:pregunta_id=># y lo mismo con encuesta_id. En el index de soluciones
el link a nueva solucion es así:
<%= link_to ‘New solucion’,
new_encuesta_pregunta_solucion_path(@encuesta, @pregunta) %>

Un saludo

Solucionado->>

<%= link_to ‘New solucion’,

new_encuesta_pregunta_solucions_path(@encuesta, @pregunta) %>

faltaba la “s” ;)…eso si…sigue sin meter el id de la pregunta en la
ruta, me toca meterlo a mano para hacer pruebas.

Salu2