El otro día, reescribiendo parte de mi juguete on Rails Pagerankalert.com, una aplicación muy sencilla con la que llevo meses sin avanzar por falta de tiempo
, me encontré con un error muy raro, de esos que el mensaje de error no te aclara nada sino que te quedas con cara de perdido…
Repasando el código con Juanjo Bazán, de KFLink, no encontrábamos dónde estaba el problema y llegamos a la conclusión de que quizá Rails se estuviera haciendo un lío porque el modelo que estaba manejando se llamaba Page, y por ejemplo cosas como la paginación podían resultar confusas… eso de paginar páginas roza lo metafísico…
Total, que probé a renombrar el modelo Page como Pagina, algo que me daba pereza ya que estamos hablando del modelo principal de esta aplicación dedicada a almacenar la evolución en el pagerank de las páginas… pero con una sencilla migración y cambios de código en las pocas líneas que componen la aplicación, media hora después ya lo tenía…
Efectivamente, tras este cambio, todo volvió a funcionar, como en el anuncio de 3 en 1. Sin duda, fué una mala elección usar Page como nombre de modelo. Y yo que en su día me sentí muy listo por usar address en lugar de URL para el campo…
Es este un tema a tener en cuenta a la hora de programar en Rails. Si bien se suele aconsejar usar nombres en inglés para aprovecharnos del tema de la pluralización automática, a veces podemos caer en trampas como ésta en la que coincida el nombre del modelo con alguna palabra reservada. Conviene pues, conocerlas, aunque en lo que he buscado hasta el momento no he visto que oficialmente, “Page” sea una palabra reservada a evitar:
Ruby on Rails wiki: Reserved Words
En esta última web, se aconseja ejecutar desde la aplicación Rails la siguiente línea para ver las palabras reservadas… tampoco allí aparece “Page”…
$ ./script/runner ‘print Object.constants.sort.join(”, “)’
ARGF, ARGV, ActionController, ActionMailer, ActionView, ActionWebService, ActiveRecord, ActiveSupport, ArgumentError, Array, BREAKPOINT_SERVER_PORT, Base64, BasicSocket, Benchmark, Bignum, Binding, Builder, CGI, CGIMethods, CROSS_COMPILING, Class, ClassInheritableAttributes, Comparable, ConditionVariable, Config, Continuation, DRb, DRbIdConv, DRbObject, DRbUndumped, Data, Date, DateTime, Delegater, Delegator, Dependencies, Deprecated, Digest, Dir, ENV, EOFError, ERB, Enumerable, Errno, Etc, Exception, FALSE, FalseClass, Fcntl, File, FileTest, FileUtils, FireRuby, Fixnum, Float, FloatDomainError, Forwardable, GC, Gem, HTML, Hash, HashWithIndifferentAccess, IO, IOError, IPSocket, IPsocket, Iconv, IndexError, Inflector, Integer, Interrupt, Kconv, Kernel, LoadError, LocalJumpError, Logger, MailHelper, Marshal, MatchData, MatchingData, Math, Method, Mime, MissingSourceFile, Module, Monitor, MonitorMixin, Mutex, Mutex_m, NIL, NKF, NQXML, NameError, Net, NilClass, NoMemoryError, NoMethodError, NotImplementedError, Numeric, Object, ObjectSpace, Observable, OpenSSL, OptionParser, OrderedHash, OrderedOptions, PLATFORM, PStore, ParseDate, ParseError, Pathname, Precision, Proc, Process, Queue, RAILS_CONNECTION_ADAPTERS, RAILS_DEFAULT_LOGGER, RAILS_ENV, RAILS_GEM_VERSION, RAILS_ROOT, RAILTIES_PATH, RELEASE_DATE, REXML, RUBY_PLATFORM, RUBY_RELEASE_DATE, RUBY_VERSION, Racc, Rails, Range, RangeError, Rational, RbConfig, Regexp, RegexpError, Reloadable, RuntimeError, SOAP, STDERR, STDIN, STDOUT, ScanError, ScriptError, SecurityError, Set, Signal, SignalException, SimpleDelegater, SimpleDelegator, SingleForwardable, Singleton, SizedQueue, Socket, SocketError, SortedSet, StandardError, String, StringIO, StringInput, StringOutput, StringScanner, Struct, Symbol, SyntaxError, SystemCallError, SystemExit, SystemStackError, TCPServer, TCPSocket, TCPserver, TCPsocket, TMail, TOPLEVEL_BINDING, TRUE, Text, Thread, ThreadError, ThreadGroup, Time, TimeZone, Timeout, TimeoutError, Transaction, TrueClass, TypeError, UDPSocket, UDPsocket, UNIXServer, UNIXSocket, UNIXserver, UNIXsocket, URI, UnboundMethod, VERSION, XMLRPC, XSD, XmlNode, XmlNodeList, XmlSimple, YAML, ZeroDivisionError, Zlib

