Forum: Rails-ES Generar encuestas: Problemas rutas REST

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Jose vicente R. (Guest)
on 2009-03-13 21:00
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? :(

Saludos
Ruben D. (Guest)
on 2009-03-13 21:10
(Received via mailing list)
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.
Ricardo M. (Guest)
on 2009-03-13 21:14
(Received via mailing list)
2009/3/13 Jose vicente Ribera pellicer
<removed_email_address@domain.invalid>
> 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/
Jose vicente R. (Guest)
on 2009-03-13 21:21
Ricardo M. wrote:
> 2009/3/13 Jose vicente Ribera pellicer
> <removed_email_address@domain.invalid>
>> 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
Ruben D. (Guest)
on 2009-03-13 21:21
(Received via mailing list)
Ops!, vi mal tu mensaje, me parece que lo indica Ricardo es lo que
necesitas, yo me estaba refiriendo a otra cosa. Mil disculpas!
Jose vicente R. (Guest)
on 2009-03-13 22:03
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.
Jose vicente R. (Guest)
on 2009-03-14 12:54
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:
<td><%=link_to encuesta.titulo, encuesta_preguntas_path(encuesta)
%></td>

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


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:
<td><%= link_to pregunta.texto,
encuesta_pregunta_solucions_path(@encuesta, @pregunta) %></td>

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. :(
Manuel González Noriega (Guest)
on 2009-03-14 13:02
(Received via mailing list)
2009/3/14 Jose vicente Ribera pellicer
<removed_email_address@domain.invalid>

> 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?
Jose vicente R. (Guest)
on 2009-03-14 13:19
Pues bien, no consigo entender porque no discrimina las preguntas por
encuestas :(

Solucionado:
En el index de preguntas-> @preguntas=@encuesta.preguntas

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

Saludos
Jose vicente R. (Guest)
on 2009-03-14 13:23
Manuel González Noriega wrote:
> 2009/3/14 Jose vicente Ribera pellicer
> <removed_email_address@domain.invalid>
>
>> 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. ;)
Manuel González Noriega (Guest)
on 2009-03-14 13:43
(Received via mailing list)
2009/3/14 Jose vicente Ribera pellicer
<removed_email_address@domain.invalid>

> 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. ;)
>


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

Me alegro que lo hayas solucionado :)
Jose vicente R. (Guest)
on 2009-03-14 14:21
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:in `index'


Parameters:

{"encuesta_id"=>"1",
 "pregunta_id"=>"1"}
Jose vicente R. (Guest)
on 2009-03-14 14:33
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 :( :(
Manuel González Noriega (Guest)
on 2009-03-14 15:28
(Received via mailing list)
2009/3/14 Jose vicente Ribera pellicer
<removed_email_address@domain.invalid>

>
> 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?
Jose vicente R. (Guest)
on 2009-03-14 16:35
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
Jose vicente R. (Guest)
on 2009-03-14 16:45
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
This topic is locked and can not be replied to.