我正在尝试从另一个控制器中调用方法并获取无方法错误。
所以我有两个控制器作业和管理员,我试着打电话:
<% @jobs.each do |job| %>
我把这个命令放在admin contoller的视图中,在admin的实际控制器文件中我有:
# GET /jobs
# GET /jobs.xml
# GET /admin
def index
@jobs = Job.all
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @jobs }
end
我认为我会把所需要的东西拉到一边但是我仍然会得到一个nomethoderror,所以我应该如何将作业控制器包含在管理员中呢?
答案 0 :(得分:0)
从您发布的代码中,您似乎没有使用查询从数据库中获取所需的作业,例如
@jobs = Job.all
Job.all
是一个activerecord查询,它从数据库中获取所有可用记录。听起来你可能会对所有MVC片段如何协同工作感到困惑。
首先,您不应该跨控制器共享方法,实际上您的控制器将只有很少的代码。
Rails将路由请求,并查找控制器中定义的操作,如果找不到,则会转到views文件夹并获取该操作名称的模板,例如请求{{ 1}}将在控制器中查找索引操作,然后如果不存在,请查找要呈现的Jobs#index
模板。因此,如果您正在提供静态数据而不需要查找数据,则甚至不需要在控制器中执行操作。但是,通常需要执行操作,因为在控制器中执行数据库和模型查找,然后将这些实例变量传递给视图。将所有数据库查询和模型操作保留在视图之外。
views/jobs/index.erb
并在视图中
def index
@jobs = Job.all
end
@jobs.each do |job| ...
块是完全没必要的,除非您想要返回格式不同于html的模板,例如xml或json用于Web服务。
答案 1 :(得分:0)
您尚未在管理员控制器中定义jobs
操作。您正在管理控制器的索引操作中加载@jobs。如果您希望这项工作,请将index
控制器的Admin
操作重命名为作业并添加该路由。添加路线的一种方法是在config/routes.rb
中添加一行。
match '/jobs' => 'admin#jobs'
通读this。