Pasar parámetros

Hola,

para aprender, estoy creando un mini-planificador de viajes casero.

Tengo creado controlador/modelo… y bases de datos de: Viaje y To-do.
Y funcionan OK.

Paro ahora están separados, he creado los has_many y belongs_to pero
tengo una duda. Quiero que un vez creado un viaje, pueda crear un to-do
a ese viaje y le quede automáticamente asignada la ID del viaje en
curso. Así cuándo cree más viajes, cada to-do aparecerá en su viaje
correspondiente.

Ahora solo se me ocurre hacerlo como en las recetas y sus categorías de:
http://www.sobrerailes.com/pages/en_marcha_con_rails

pero es un estorbo tener que poner en cada to-do un menú para escoger el
viaje que le toca, como si fuese una categoría.

¿Cómo condicionar la creación dentro de un viaje que estamos viendo en
SHOW y que se le asigne el ID correspondiente?

No sé si es lo mejor, pero yo lo que hago es:
En el show de viaje le pongo un link al new de to-do, pasándole como
ID el viaje, para que quede
así:
/to-dos/new/1

(ese 1 es el ID de viaje, no de to-do, obviamente)

En el controlador:

def new
@to-do = To-do.new(:viaje_id => params[:id])
end

Listo, ahora podés dejar el combo en el _form (porque debería tomar el
valor del ID automáticamente, o bien podés cambiarlo por un hidden)
Acordate por un tema de usabilidad, cuando terminás un create o
update, hacer el redirect al show del viaje padre:

redirect_to :controller => ‘viajes’, :action => ‘show’, :id =>
@to-do.viaje.id

Espero que haya ayudado…

saludos!

Gracias por la respuesta Damian, pero lo he probado todo y sigo haciendo
algo mal.

He visto otro post relacionado, pero tampoco encuentro mi fallo.
http://www.ruby-forum.com/topic/85400#156239

He hecho un controlador de “Notas” para cada viaje. Creo que el problema
está cuándo quiero grabar el viaje_id una vez grabo el texto de la nota.
No paso bien los dos parámetros. A demás, he puesto el formulario de
texto en la misma página de mostrar, como si de un to-do se tratase,
cosa que me complica aún más encontrar el error.

Los códigos que he utilizado son. El “show” del viaje:

<% for column in Viaje.content_columns %>

<%= column.human_name %>: <%=h @viaje.send(column.name) %>

<% end %>

<%= link_to ‘Edit’, :action => ‘edit’, :id => @viaje %> |
<%= link_to ‘Back’, :action => ‘list’ %>


<%= link_to ‘Notas’, :controller => ‘notas’, :action => ‘add_item’,
:id => @viaje %>

y el controlador de las Notas:

class NotasController < ApplicationController
scaffold :nota

def index
@items = Nota.find_all
end

def add_item
item = Nota.new(:viaje_id => params[:id])
item.attributes = @params[“new_item”]

if item.save
  redirect_to(:action => "index")
else
  render_text "Couldn't add new item"
end

end

def destroy
item = Nota.find(@params[“id”])
begin
item.destroy
redirect_to(:action => “index”)
rescue ActiveRecord::ActiveRecordError
render_text “Couldn’t destroy item”
end
end

end

Como para ver las notas he definido index, entonces:

Notas <% @items.each do |@item| %> <%= @item.texto %> <%= link_to("Edit", :action => "edit", :id => @item.id) %> <%= link_to("Destroy", { :action => "destroy", :id => @item.id }, :confirm => "Are you sure you want to delete this entry: #{@item.texto}") %>
<% end %>
New item:
<%= text_area("new_item", "texto") %>

no se si es lo que pides, pero yo lo soluciono asi:
en mi caso muestro tb por show los datos de la empresa y luego
tengo un link para añadir centro q salta al vista de new del scaffold
de centro

luego en el controlador simplemete:
eso si creo q en todo sitios le paso el parametro id @empresa

def new
@empresa = Empresa.find(params[:id])
@centro = Centro.new
end

def createcentro
@centro = Empresa.find(params[:id]).centros.create(params[:centro])
if @centro.save
flash[:notice] = ‘Centro was successfully created.’
redirect_to :action => ‘list’, :id => Empresa.find(params[:id])
else
render :action => ‘new’
end
end

Es que en el método add_item estás sobreescribiendo el atributo viaje_id.

Veo el código generado y me parece que hay mucho de TOD (the old
days)… estás usando la última versión de Rails?

Hacé esto, generá el scaffold de nota normalmente, y repetí los pasos
que te dije en el mail anterior.

La idea es que tenés un método new en el controlador que devuelve un
formulario sin contenido:

def new
@nota = Nota.new(:viaje_id => params[:id])
end

En el _form.rhtml deberías agregar un hidden para luego hacer POST de
este valor:

<%= hidden_field ‘nota’, ‘viaje_id’ %>

Luego el método create debería tomarlo bien.

Decime si vamos por el camino correcto :slight_smile:

On 11/28/06, Jantons [email protected] wrote:

def add_item
item = Nota.new(:viaje_id => params[:id])
item.attributes = @params[“new_item”]