Duda inflector

Sebastian D.
escribió:> si abres la consola (script/console) y escribes “origen”.pluralize que

te sale como resultado?

lo probé, saca origenes, lo hace bien

tienes ruby-debug instalado? podrias intentar colocar un breakpoint
justo antes del “class Origen” a ver que te dice.

Otra prueba que puedes hacer es poner un par de banderas, una justo
antes del class Origen, y otra justo antes del inflector.

en app/models/origen.rb

RAILS_DEFAULT_LOGGER.debug “========= cargando el modelo Origen
==========”
class Origen < ActiveRecord::Base

y en config/environment.rb

RAILS_DEFAULT_LOGGER.debug “========= definiendo los inflexores
==========”
Inflector.inflections do |inflect|

luego abre el script/console, intenta con “origen”.pluralize, luego
pon una marca en el log con:
RAILS_DEFAULT_LOGGER.debug “========= desde la consola ==========”
y finalmente intenta el modelo, en la misma consola:
Origen.find(:all)

y cierra la consola

revisa log/development.log y deberias encontrar los tres mensajes y
algo de sql del modelo (si es que no se quejo por no poder encontrar
la tabla).

En el caso ideal, deberias tener el debug de inflexores primero,
seguido del de la consola y por ultimo del de Origen, y luego el SQL
del find(:all).

Si te sale el de Origen antes de los inflexores es que algo lo esta
activando antes de tiempo.

Sebastian D.
escribió:>

Y tambien es posible que este conflicto entre modelo y pluralizador
sea sintoma de un problema mayor que tarde o temprano saldra a relucir
por otro lado.

Asi que nada, Miguel Angel, a explorar hasta que consigas la fuente
del problema.

Si, efectivamente ya quiero profundizar y ver dónde está el problema.
Primero puse el set_table_name, a lo que parece que funcionó ya no me
daba el error de que no encontraba la tabla, pero el siguiente error me
dio en la vista con:

undefined local variable or method `new_origen_path’ for
#ActionView::Base:0x2aaaac36c910, el helper no lo encuentra.

Ahora mismo he probado poniendo las banderas que me has dicho y en la
consola sale todo correcto:
========= definiendo los inflexores ==========
========= desde la consola ==========
========= cargando el modelo Origen ==========
^[[4;36;1mSQL (0.000221)^[[0m ^[[0;1mSET SQL_AUTO_IS_NULL=0^[[0m
^[[4;35;1mControl Load (0.000237)^[[0m ^[[0mSELECT * FROM origenes
^[[0m

Recuerdo que cree el scaffold de la siguiente manera:

script/generate scaffold origen nombre:string

No se si dará problemas por usar el scaffold, todo me lo crea correcto.

Y ahora he optado por poner todos los controladores y métodos en inglés y
seguir la convención para que no me den estos problemas, pero qué duda cabe
que ya tengo la intriga y quiero saber por qué. Me lo hace bien en la
consola, pero en el controlador no

Sobre el ruby-debug lo voy a mirar porque me interesaría hacer breakpoints
y ver por dónde pasa.

Muchos estaran pensando porque diablos no se deja de tonterias y usa
el set_table_name y se olvida de los inflexores, o se deja de estar
nombrando sus modelos en español.

Si bien yo personalmente prefiero que todo mi codigo fuente este en
ingles, por mera consistencia, me parece que cada quien tiene derecho
a escoger sus mañas.

Y esta es la situacion perfecta para entender un poco mas como
funciona Rails internamente, cosa que nunca esta de mal.

Y tambien es posible que este conflicto entre modelo y pluralizador
sea sintoma de un problema mayor que tarde o temprano saldra a relucir
por otro lado.

Asi que nada, Miguel Angel, a explorar hasta que consigas la fuente
del problema.

si en lugar de la consola inicias el servidor (script/server) en que
orden aparecen los flags?

se me hace que es posible que el modelo este siendo referenciado desde
las rutas, y que es posible que las rutas no sean activadas para la
consola.

Sebastian D.
escribió:> si en lugar de la consola inicias el servidor (script/server) en que

orden aparecen los flags?

se me hace que es posible que el modelo este siendo referenciado desde
las rutas, y que es posible que las rutas no sean activadas para la
consola.

Acabo de hacerlo, abro el script/server, lo primero que hace es definir
los inflexores, carga el modelo origen pero luego peta

========= definiendo los inflexores ==========

Processing OrigenesController#index (for x.x.x.x at 2008-04-09 15:15:19)
[GET]
Session ID:
BAh7CToOcmV0dXJuX3RvMDoMdXNlcl9pZGkHOgxjc3JmX2lkIiUzZDJlNjFi%0AMDE0MDg0YTVkMmM4NDJkZTlkZDQ4ZGFiYSIKZmxhc2hJQzonQWN0aW9uQ29u%0AdHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D–06675fd1f4fe1fd7432f3c78272fee495ef5dbe1
Parameters: {“action”=>“index”, “controller”=>“origenes”}
Pagina Load (0.000329) SELECT * FROM paginas WHERE (deleted=0 and
hidden=0 and menu=2) ORDER BY orden
========= cargando el modelo Origen ==========
Control Load (0.000000) Mysql::Error: Table
‘editec_development.origens’ doesn’t exist: SELECT * FROM origens

ActiveRecord::StatementInvalid (Mysql::Error: Table
‘editec_development.origens’ doesn’t exist: SELECT * FROM origens ):

/usr/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract_adapter.rb:150:in
`log’

/usr/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/mysql_adapter.rb:281:in
`execute’

/usr/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/mysql_adapter.rb:481:in
`select’

/usr/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/database_statements.rb:7:in
`select_all_without_query_cache’

/usr/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/query_cache.rb:53:in
`select_all’

/usr/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/query_cache.rb:74:in
`cache_sql’

/usr/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/query_cache.rb:53:in
`select_all’

/usr/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/base.rb:532:in
`find_by_sql’

/usr/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/base.rb:1233:in
`find_every’

/usr/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/base.rb:503:in
find' /app/controllers/origenes_controller.rb:5:inindex’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/base.rb:1158:in
`send’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/base.rb:1158:in
`perform_action_without_filters’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:697:in
`call_filters’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:689:in
`perform_action_without_benchmark’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/benchmarking.rb:68:in
perform_action_without_rescue' /usr/lib/ruby/1.8/benchmark.rb:293:inmeasure’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/benchmarking.rb:68:in
`perform_action_without_rescue’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/rescue.rb:199:in
`perform_action_without_caching’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/caching.rb:678:in
`perform_action’

/usr/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/query_cache.rb:33:in
`cache’

/usr/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/query_cache.rb:8:in
`cache’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/caching.rb:677:in
`perform_action’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/base.rb:524:in
`send’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/base.rb:524:in
`process_without_filters’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:685:in
`process_without_session_management_support’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/session_management.rb:123:in
`process’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/base.rb:388:in
`process’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/dispatcher.rb:171:in
`handle_request’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/dispatcher.rb:115:in
`dispatch’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/dispatcher.rb:126:in
`dispatch_cgi’

/usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/dispatcher.rb:9:in
`dispatch’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel/rails.rb:76:in
`process’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel/rails.rb:74:in
`synchronize’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel/rails.rb:74:in
`process’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel.rb:159:in
`process_client’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel.rb:158:in
`each’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel.rb:158:in
`process_client’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel.rb:285:in
`run’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel.rb:285:in
`initialize’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel.rb:285:in
`new’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel.rb:285:in
`run’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel.rb:268:in
`initialize’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel.rb:268:in
`new’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel.rb:268:in
`run’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel/configurator.rb:282:in
`run’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel/configurator.rb:281:in
`each’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel/configurator.rb:281:in
run' /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/mongrel_rails:128:inrun’

/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/…/lib/mongrel/command.rb:212:in
run' /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.4/bin/mongrel_rails:281 /usr/bin/mongrel_rails:19:inload’
/usr/bin/mongrel_rails:19

Hola,

De hecho con los inflectors, se puede arreglar la pluralización y todo
deberia funcionar correctamente. Al igual que deberia funcionar
correctamente utilizar el set_table_name y algun otro hack. De
hecho, me jugaria un pez de colores a que Rails setea el nombre de la
tabla a partir del modelo con el mismo set_table_name.

te lo jugarías… y ganarías… si sólo usas el core de rails y si sólo
usas plugins bien hecho. Todos sabemos que muchísimos plugins (no sólo
de rails, pero en este caso hablamos de rails) son pelín chapuzas y
hacen las cosas de aquellas maneras… y no te das cuenta hasta que te
vuelves loco por algo y lo acabas trazando hasta el código del plugin.

Según qué plugins uses, no vas a tener tanta suerte porque algunos no
tienen en cuenta que todos esos parámetros son configurables.

La voz de la experiencia me dice que eso pasa (me ha pasado), y después
de ver cuál era el problema he decidido usar inflectors/set_table_names
y otras configuraciones solamente cuando es estrictamente necesario, es
decir, cuando trabajo con una base de datos legacy. Para todo lo demás,
si sigues la opinión del framework te evitas disgustos.

Esto es lo mismo que cuando empecé a trabajar con Rails y no me gustaban
las convenciones de nombres de tablas, el uso de tablas con PK no
compuesta, etc… después de ver los efectos (negativos) de intentar
luchar contra todo eso, acabas acostumbrándote a hacer las cosas como
Rails dices… y acabas trabajando más rápido y con menos problemas.

En un framework con opinión, es mejor no llevarle la contraria.

saludos,

javier ramírez