AR.to_json Obras em Console, falha no navegador
-
03-07-2019 - |
Pergunta
Eu tenho este bloco de código:
users = Array.new
users << User.find(:all, :conditions => ["email like ?", "%foo%"])
users << User.find(:all, :conditions => ["name like ?", "%bar%"])
users.flatten!
users.uniq!
puts users.to_json :include => [:licenses]
Quando eu executá-lo usando script / console, ele retorna exatamente o que você acha que deveria, uma representação JSON da Matriz de usuários que eu encontrei, achatada, e uniquified. Mas correr essa mesma linha de código como parte de um método search_for_users
, eu recebo este erro
TypeError em controllername # search_for_users
errado tipo de argumento Hash (espera de dados)
e a linha referenciada é a linha com a chamada .to_json.
Isso está me confundindo porque o código é literalmente o mesmo. A única diferença é que quando eu estou correndo-lo no console, eu estou entrando as condições manualmente, mas no meu método, eu estou puxando a consulta a partir params[:query]
. Mas, eu apenas tentei codificar as consultas e obteve o mesmo resultado, então eu não acho que é o problema. Se eu remover o :include
, eu não ver o erro, mas eu também não obter os dados que deseja.
Alguém tem alguma idéia do que o problema pode ser?
Solução
Existem alguns plugins e pedras preciosas que podem causar .to_json a falhar se incluído no seu controlador. Eu acredito que a gema Twitter é um deles (ran em um problema com este algum tempo atrás).
Você tem "incluem [nada]" ou "exigem [nada]" neste controlador?
Se não, eu sugiro remover temporariamente quaisquer plugins que você está usando para solucionar problemas, etc.
Finalmente, o que acontece se você substituir a ação do controlador inteiro com simplicidade: % W (1 2 3 4 5) .to_json
Isso deve ajudá-lo a fixar para baixo o que está a falhar.
Outras dicas
Sempre que o código em testes ou se comporta diferentes de console do ambiente de produção (que é um palpite ... você pode estar executando o seu site no modo de desenvolvimento), isso exige uma questão de ordem de carregamento. Em ambiente de produção, todos os modelos e controladores são pré-carregados, em outros ambientes eles são carregados preguiçosamente quando necessário.
Comece o seu console com RAILS_ENV=production ./script/console
e veja se você pode reproduzir o erro desta forma.
Como cscotta mencionado, há um par de gemas e librarys, que podem interferir com .to_json, primeiro a mencionar a funcionalidade, que você começa quando você precisar 'json'. Eu, pessoalmente, correu para vários problemas com isso.
Espero que isso ajude
Seb