项目地址: https://github.com/CoolDrinELiu/graduation.git 花了一晚上加一早晨调试,最终解决了问题,但没有搞清楚到底原因是什么,有兴趣克隆下来看看吧。整个后台就 2 个模块,内容并不多 实在不想继续深究问题的根源了...1 是马上要答辩没多的时间,2 是已经累觉不爱了....
出错是在调用 Micropost 对象时,进入_where 方法会 clone 自己,就是克隆自己的时候出错(还有个层完全一样的 user model,运行到这 clone 自己就不会有任何问题)
解决方法是将:_where 方法的 clone 换成 self。 _where 方法的全部内容在 11 楼 - 传送门 -
def _where params
relation = clone
...
...
...
原因:不知道
先描述下现象: 建了一个空的 microposts_controller.rb,继承 patters_controller,里面定义的是后台可以规整在一起的 index edit update 等方法。patters_controller 继承 application_controller。里面有些常用方法。
在任何一个项目文件中直接按保存,不做任何改动,直接保存(什么也没改动),报错。但这时直接再刷新,一切正常。 完整的报错信息是这样,
ActiveRecord::StatementInvalid in Manage::Microposts#index
Showing /home/ljy/micro/app/views/manage/microposts/index.html.slim where line #2 raised:
SQLite3::SQLException: no such table: : SELECT "".* FROM "" ORDER BY "microposts"."created_at" DESC, created_at desc
Extracted source (around line #2):
1 = content_for :tbody do
2 - @microposts.each do |entry|
3 tr
4 td = entry.id
5 td = entry.user.email
6
这个表是有的,死活不知道为什么给这个报错。
大概定位了问题出在那个 default 方法上,当我随便保存一下(第一次打开 microposts 的 index 页面肯定会报错)。打在 default 方法里的断点进去后,如果我在终端输入一个 self 后按回车,所有断点直接 exit 退出去,一切正常。也就是说,不知道为什么 default 方法没有被完整执行???实在不知道为什么了。
我在https://ruby-china.org/topics/29674 里也遇到过类似的问题,出错特征都差不多。不知道是哪里关键字冲突,上一次是换了一个 namespace,就没有出现类似问题,我也就略过问题的根源了。这次居然又出现(崩溃)
我整个 manage 域下就 2 个资源,users 页面完全正常,没有任何问题。也没有其他方法、类名、字段啥的叫 manage 求助各位朋友...
路由:
namespace :manage do
root 'homes#index'
resources :homes
resources :users
resources :microposts
end
view/manage/microposts/index.html.slim 就是报错的地方第 2 行的@microposts
= content_for :tbody do
- @microposts.each do |entry|
tr
td = entry.id
td = entry.user.email
/controller/patters_controller.rb
class Manage::PatternsController < Manage::ApplicationController #:nodoc:
def index
render text: '', layout: true and return if controller_name.match(/application/)
records = model.default(params)
instance_variable_set "@#{controller_name}", records
end
/controller/microposts_controller.rb
class Manage::MicropostsController < Manage::PatternsController
end
.default 方法
def default(params, options = {})
self
._where(params[:where])
.order(params[:order]||"created_at desc")
end
_where 方法是一个查询,方法有点长,不是它里免出错的,第一次刷新页面 params[:where] 里都是空的,不会有影响。