Rails2 y el generador de scaffold

Hola,

estoy comenzando a usar rails2 y me estoy encontrado con el siguiente
problema,
tengo un modelo que se llama Articulo y un controlador que se llama
Admin, y estoy intentando generar un scaffold de Articulo con el
controlador Admin, pero por más que lo intento con “script/generate
scaffold Articulo Admin” me da el siguiente error “wrong number of
arguments (1 for 2)” aunque si no uso el nombre del controlador creará
uno nuevo con el nombre del modelo en plurar, pero esto no es lo que
necesito.

viendo la ayuda del generador scaffold parece que la opción de generar
scaffold especificando el controlador ya no es posible.

¿Que me recomienda hacer para subsanar este problema?

por otro lado, soy un tanto novato en esto del MVC y no se si mis ideas
se ajustan a esta metodologia, la idea es crear un catalogo online, con
los modelos, Articulo y Categoria, luego tener dos interfaces, una para
el visitante/usuario con la posibilidad de acceder a una zona privada
con su registro y otra zona para la administracion del catalogo.

pues mi idea era esa,
Modelos: Articulo y Categoria
Controladores: Admin y Catalogo (catalogo es para los usuarios)
Vistas: las que correspondan a cada caso

¿lo veis bien orientado a la metodologia MVC?

un saludo y gracias,

Ancor.

Si lo que quieres es separar la administración, puedes hacer:

script/generate scaffold admin/articulo

script/generate scaffold admin/categoria

Las vista y controladores te quedan en una carpeta admin

y las URL serán /admin/articulos/new /admin/categorias/new, etc.

El día 25/02/08, Ancor C. [email protected]
escribió:

uno nuevo con el nombre del modelo en plurar, pero esto no es lo que
los modelos, Articulo y Categoria, luego tener dos interfaces, una para
un saludo y gracias,


Saludos
Atte

Jean Marcel Droguett A.

tambien al hacer el scaffold en rails2 tienes que declarar los campos
del
modelo

generate scaffold admin/posts title:text publish:integer …

Saludos

2008/2/25 Jean D. [email protected]:

El Lunes, 25 de Febrero de 2008, Miguel M. escribió:

tambien al hacer el scaffold en rails2 tienes que declarar los campos del
modelo

generate scaffold admin/posts title:text publish:integer …

Me di cuenta de esto el otro día. ¿Alguien sabe por qué este requisito
que
antes no existía?

Anteriormente, si mal no recuerdo, al hacer un scaffold Rails
consultaba el modelo y generaba el scaffold, de esta manera si
modificabamos o añadiamos un atributo al modelo, teniamos que generar
nuevamente el scaffold.

On Feb 25, 2008, at 11:12 PM, Iñaki Baz C. wrote:


Iñaki Baz C.


Ror-es mailing list
[email protected]
simplelogica.net


Not sent from my iPhone

El Lunes, 25 de Febrero de 2008, Francesc E.
escribió:> Anteriormente, si mal no recuerdo, al hacer un scaffold Rails

consultaba el modelo y generaba el scaffold, de esta manera si
modificabamos o añadiamos un atributo al modelo, teniamos que generar
nuevamente el scaffold.

Pero no entiendo la diferencia. Si ahora añado o modifico el modelo tengo
que
retocar las vistas (como poco) igual que lo hacía antes (o eso o eliminar
todo el scaffold y rehacerlo desde cero).
¿Cuál es ahora la diferencia?

Gracias.

Que te genera la migración a la vez que creas el scaffold, antes la
tenías que hacer a posteriori. No es que sea un gran avance, pero
ahorra algo de tiempo.

Supongo que lo han hecho partiendo de la base de que cuando creas un
scaffold sabes los campos que va a tener tu modelo y así en una sola
línea lo ventilas todo.

El 25/02/2008, a las 23:40, Iñaki Baz C.
escribió:

El Lunes, 25 de Febrero de 2008, Francesc E. escribió:

Anteriormente, si mal no recuerdo, al hacer un scaffold Rails

Hola, lo que puedes hacer es tener un controller para el publico general
/posts y uno en admin/posts
como el modelo el scaffold lo crea en admin/post, para acceder al
modelo
debes hacerlo asi Admin::Post,
entonces puedes acceder a tus modelos desde cualquier lugar

ej

def catalogo
@articulo = Admin::Articulo.find(:all)

end

yo lo he hecho asi y funciona, ahora si no es la mejor forma o
si me estoy equivocando , por favor corriganme

espero sirva la ayuda

Saludos

2008/2/26 Ancor C. [email protected]:

he seguido tus indicaciones y he lanzado
script/generate scaffold Admin/Articulo nombre:string referencia:string
descripcion:string precio:float nuevo:bool

y como has dicho me ha creado los subdirectorios admin dentro de models,
controllers y demás, y ahí dentro se han creados el controlador, modelo,
etc de Articulo, pero claro, si siguiera este metodo creo q tendria que
crear dos modelos diferentes (con igual contenido) para la parte de
administracion y otro para la parte de los usuarios.

Yo lo que realmente quiero, es tener los modelos Articulo y Categoria, y
mi idea era tener un controlador para gestionarlos como administrador y
tener otro para el uso de los usuarios que se llamarian Admin y Catalogo
respectivamente, con sus vistas.

No se si esta es la mejor forma de hacerlo ya que yo en la metodologia
MVC ando un tanto verde.

Gracias, un saludo.
Ancor

Jean D. wrote:

Si lo que quieres es separar la administración, puedes hacer:

script/generate scaffold admin/articulo

script/generate scaffold admin/categoria

Las vista y controladores te quedan en una carpeta admin

y las URL serán /admin/articulos/new /admin/categorias/new, etc.

El día 25/02/08, Ancor C. [email protected]
escribió:

uno nuevo con el nombre del modelo en plurar, pero esto no es lo que
los modelos, Articulo y Categoria, luego tener dos interfaces, una para
un saludo y gracias,


Saludos
Atte

Jean Marcel Droguett A.

Michel, Ancor… estáis confundiendo modelo con controlador.

En este ejemplo, tendríamos sólo dos modelos:

  • Articulo
  • Categoria

Esos modelos los podemos controlar de diferentes maneras… por ejemplo:

  • /admin/articulos # administración de artículos (generado con scaffold,
    tiene index, show, new, create, etc.)
  • /admin/categorias # administración de categorías (idem)
  • /articulos # parte pública de artículos (solo index, show… no tendrá
    acciones destructivas)

En particular, esta línea me ha horrorizado especialmente:

@articulo = Admin::Articulo.find(:all)

Sería, en todo caso:

@articulos = Articulo.find(:all)

o sea, acostumbraos a usar el plural si estamos hablando de
colecciones… Y
el modelo será Articulo, no Admin::Articulo… estamos hablando siempre
del
mismo modelo.

Otra manera de hacerlo es no separar entre parte pública y parte de
administración. O sea, generas el scaffold en /articulos y en
/categorias. Y
después controlas que sólo el que se ha identificado como administrador
pueda usar las acciones new, create, edit, update y destroy, y sólo se
le
muestre el enlace a esas acciones si es administrador.

Pero, por favor, léanse los manuales de Rails… si no se sabe lo
básico, en
esta lista sólo conseguiremos ruido.

Gracias!

Jaime

El día 26/02/08, Miguel M. [email protected]
escribió:

claro, al parecer en rails 2 si generamos un scaffold admin/algo , el
modelo
lo deja en carpeta models/admin/

2008/2/26 Jean D. [email protected]:

que raro que el modelo te quede en el subdirectorio admin, por lo menos
en
rails menores a la 2.0 el modelo queda donde siempre.

El día 26/02/08, Ancor C. [email protected]
escribió:

y las URL serán /admin/articulos/new /admin/categorias/new, etc.


Ror-es mailing list
[email protected]
simplelogica.net


Saludos
Atte

Jean Marcel Droguett A.

Hola, hay algo que no me queda claro entonces, porque cuando generas un
scaffold tipo admin/blog

el modelo que se guarda en models/admin queda asi:

models/admin/blog.rb

class Admin::Blog < ActiveRecord::Base

entonces si vamos a acceder a

@articulos = Articulo.find(:all) vamos recibir un error,

Tambien, en el caso que queramos dejar a admin/blog.rb como

class Blog < ActiveRecord::Base

tambien vamos a recibir un error porque rails espera recibir una
definicion
de modelo asi Admin::Blog

Saludos

2008/2/26 Jaime I. [email protected]:

tiene index, show, new, create, etc.)

  • /admin/categorias # administración de categorías (idem)
  • /articulos # parte pública de artículos (solo index, show… no tendrá
    acciones destructivas)

En particular, esta línea me ha horrorizado especialmente:

@articulo = Admin::Articulo.find(:all)

jejej toda la razón lo tomare en cuenta :smiley:

administración. O sea, generas el scaffold en /articulos y en /categorias. Y
después controlas que sólo el que se ha identificado como administrador
pueda usar las acciones new, create, edit, update y destroy, y sólo se le
muestre el enlace a esas acciones si es administrador.

Pero, por favor, léanse los manuales de Rails… si no se sabe lo básico,
en esta lista sólo conseguiremos ruido.

El Martes, 26 de Febrero de 2008, Emili
Parreño escribió:> Que te genera la migración a la vez que creas el scaffold, antes la

tenías que hacer a posteriori. No es que sea un gran avance, pero
ahorra algo de tiempo.

Supongo que lo han hecho partiendo de la base de que cuando creas un
scaffold sabes los campos que va a tener tu modelo y así en una sola
línea lo ventilas todo.

En el fondo me parece bien. Personalmente me parecía demasiado “jipi” dar
por
hecho que vamos a necesitar en el modelo los mismos campos que en la
tabla, o
sea, facilitaba las cosas, pero era “excesiva” magia.

Saludos.

El Martes, 26 de Febrero de 2008, Miguel M. escribió:

claro, al parecer en rails 2 si generamos un scaffold admin/algo , el
modelo lo deja en carpeta models/admin/

Hombre, yo me imagino que el scaffold es una forma muy rápida de
“hacerlo
todo”, pero que por su propia naturaleza no hace “todo” lo que queremos.

Si necesitamos un modelo compartido por varios controladores, estando
estos en
namespaces diferentes entiendo que es necesario hacerlo por partes (el
modelo, luego cada controlador…).

Si generas dos modelos …

script/generate model post
script/generate model admin/post

No dejan de ser el mismo modelo. Puedes generar nuevos items …

Post.create(:title => “This is chelm”)
Admin::Post.create(:title => “This is chelm”)

que se guardaran en la misma tabla … y a mi hasta aquí me parece
todo correcto.

Lo que podriamos hacer es tener validaciones para cada uno de los
modelos.

class Post < ActiveRecord::Base
end

class Admin::Post < ActiveRecord::Base
validates_presence_of :title
end

De manera que esto no creo que nos tenga que horrorizar tanto :wink:

Admin::Post.new.valid?
=> false
Post.new.valid?
=> true

Un saludo,

Francesc

On Feb 26, 2008, at 2:41 PM, Miguel M. wrote:

tendrá acciones destructivas)

escribió:
Hola, lo que puedes hacer es tener un controller para el publico
end

que

los modelos, Articulo y Categoria, luego tener dos interfaces,
Posted via http://www.ruby-forum.com/.


Atte.
Miguel Michelson Martinez

www.artenlinea.cl _______________________________________________
Ror-es mailing list
[email protected]
simplelogica.net


Not sent from my iPhone

Creo que la confusión con todo este tema es que el generador de
scaffolds
tiene sus limitaciones, o sus características según se mire, y sólo
espera
que le pasemos el nombre del modelo y no el del controlador.

No creo que sea buena idea esto de generar un scaffold para Post y otro
para
Admin/Post porque entonces nos creará dos archivos de modelo cuando en
realidad es la misma cosa.

La solución: o bien tener la administración integrada con la parte
pública,
o generar el scaffold para Post en plan normal:

script/generate scaffold Post titulo:string cuerpo:text

y después moverlo a mano, dejando el modelo en app/models/post.rb pero
moviendo el controlador, vistas y tests dentro de sus correspondientes
carpetas de /admin:

app/controllers/posts_controller.rb ==>
apps/controllers/admin/posts_controller.rb
app/views/controllers/* ==> apps/views/admin/controllers/*

en las clases hace falta cambiar a mano el nombre, por ejemplo:

class PostsController ==> class Admin::PostsController

Además hay que modificar las rutas para usar namespaces:

map.namespace(:admin) do |admin|
admin.resources :posts
end

Y adaptar las rutas en controladores y vistas, por ejemplo:

new_post_path ==> new_admin_post_path

Suena un poco lío pero en realidad se hace en 10 minutos.

Jaime

El día 29/02/08, Ancor C. [email protected]
escribió:

Hola,

finalmente me decidí a crearlo en un solo controlador, ahora mismo estoy
en ello, la base estaba funcionando, pero me metí a moverlo a la carpeta
catalogo siguiendo tus instrucciones y de momento todo funciona “bien”
salvo que los datos introducidos en los formularios se pierden, por
ejemplo intento hacer una modificiación, me dice que se hizo OK pero…
esa modificación no se guarda, cuando intento crear un elemento nuevo me
dice que el campo esta vacio.

¿que puede ser lo que esta ocurriendo?

Jaime I. wrote:

Hola,

gracias a todos por las respuestas,

finalmente me he decantado por hacerlo por una de las alternativas que
plantea Jaime, todo en el mismo controlador y añadir comprobación de que
el usuario es el administrador para la acciones destructivas. No se si
sera la mejor forma pero me parecio quizas la mas sencilla.

ya les contaré el resultado que me ha dado.

un saludo.

Jaime I. wrote:

Hola,

Ademas de esto que mencioné en el post anterior, estaba utilizando
“nested routes” para reperesentar articulos dentro de las categorias
como dice Fabio Akita en el post

en este caso son comentarios dentro de post.

y ahora al entrar en la ruta,
http://0.0.0.0:3000/catalogo/categorias/1/articulos, me muesta el
siguiente error,

Showing catalogo/articulos/index.html.erb where line #21 raised:

undefined method `catalogo_categoria_catalogo_articulo_path’ for
#ActionView::Base:0xb6ecf1ec

Extracted source (around line #21):

18: <%=h articulo.precio %>
19: <%=h articulo.categoria.nombre %>
20: <%=h articulo.nuevo %>
21: <%= link_to ‘Show’, [@categoria, articulo] %>
22: <%= link_to ‘Edit’, [:edit, @categoria, articulo] %>
23: <%= link_to ‘Destroy’, [@categoria, articulo], :confirm =>
‘Are you sure?’, :method => :delete %>
24:

aquí si que me perdí y ya no se ni por donde buscar, en google no he
encontrado nada de interes y cada cosa que intento hacer parece que lo
agraba más.

solo añadir que antes de hacer el translado a catalogo/ todo estaba
funcionando bien.

un saludo y gracias a todos,
Ancor C…

Ancor C. wrote:

Hola,

finalmente me decidí a crearlo en un solo controlador, ahora mismo estoy
en ello, la base estaba funcionando, pero me metí a moverlo a la carpeta
catalogo siguiendo tus instrucciones y de momento todo funciona “bien”
salvo que los datos introducidos en los formularios se pierden, por
ejemplo intento hacer una modificiación, me dice que se hizo OK pero…
esa modificación no se guarda, cuando intento crear un elemento nuevo me
dice que el campo esta vacio.

¿que puede ser lo que esta ocurriendo?

Jaime I. wrote: