【问题标题】:Completed 500 Internal Server Error in Ruby on Rails在 Ruby on Rails 中完成 500 内部服务器错误
【发布时间】:2015-02-23 19:23:12
【问题描述】:

我正在尝试进行搜索,但没有得到任何结果。这是错误的:

def BuscarRoles(usuario)
    @sql="SELECT * FROM rols WHERE id_rol IN (SELECT id_rol FROM rol_usuarios WHERE id_usuario =  "+usuario.to_s+")"
    @roles = ActiveRecord::Base.connection.execute(@sql)
    @tira='['
   if @roles.count>0
                @aroles.each do |rol|
                 @tira = @tira+" { id_rol: '" + rol.id_rol.to_s + "', descripcion: '" + rol.descripcion.to_s
                 j=j+1
                 if j<@roles.count
                  @tira = @tira+ " }, "
                 else
                  @tira = @tira+" } ] "
                 end
                end
    else
                @tira= @tira+"{ { text: 'No hay datos', id: '0', href: '', leaf: true } } ]"
    end
    return @tira
  end

【问题讨论】:

  • 没有人能理解这一点 :( 发布跟踪。顺便说一句,您检查跟踪并尝试找出导致问题的行吗?
  • 导致问题的行“@aroles.each do |rol|”就像 obj 为零。但数据库中有行
  • 这段代码非常危险。原始查询使用原始 SQL 运行,没有任何转义,结果手动呈现为 JSON。方法名称是 CamelCased 并且被语法高亮与常量混淆。我什至不是在谈论使用模型和关联。祝你好运,先生。没有讽刺。但我谦虚地建议重写。

标签: mysql ruby-on-rails ruby activerecord mysql2


【解决方案1】:

仅查看代码,没有给出任何痕迹,我只能看到可能导致错误的一件事。

ActiveRecord::Base.connection.execute
#the result of the above code is Mysql2::Result of course depending on what database you're using.

因此,您不能像在模型对象上那样对结果使用 .(dot) 运算符。

因此您可以在代码中进行以下更改

@aroles.each do |rol|
  #puts rol.id_role => this will throw error 
  puts rol[0] # this should work assuming id_role is the first column
end

这应该会有所帮助。正如您在评论中提到的,您在@aroles.each do |rol| 中出现错误,那么您必须检查 sql 语句是否返回任何结果?

顺便说一句,即使查询没有返回任何结果,它也只会返回一个空数组,而迭代一个空数组只会简单地给出任何结果,但不会引发任何错误。

所以总结

  1. 检查是否有任何记录返回
  2. 使用索引而不是列名,因为它们是 active_record 对象

希望对您有所帮助。

【讨论】:

  • 非常感谢,您的信息很有帮助!
  • 如果它解决了您的问题,请不要忘记接受答案。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多