从 Rails 中的其他控制器调用方法
Posted
技术标签:
【中文标题】从 Rails 中的其他控制器调用方法【英文标题】:Call methods from other controllers in rails 【发布时间】:2011-02-20 13:42:47 【问题描述】:我试图从另一个控制器中调用一个方法并得到一个无方法错误。
所以我有两个控制器 Jobs 和 Admin,我正在尝试调用:
<% @jobs.each do |job| %>
我将此命令放在管理员控制器的视图中,在我拥有的管理员的实际控制器文件中:
# 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,那么我应该如何将作业控制器包含到管理控制器中?
【问题讨论】:
你能发布错误信息吗? NoMethodError in Admin#jobs Showing /Users/olliejudge/escrapid/app/views/admin/jobs.html.erb where line #19: 你有一个 nil 对象,但你没想到它!您可能期望有一个 Array 的实例。评估 nil.each 时发生错误提取的源代码(第 19 行附近):16:从您发布的代码来看,您似乎没有使用查询从数据库中获取您想要的工作,例如
@jobs = Job.all
Job.all
是一个从数据库中获取所有可用记录的活动记录查询。听起来您可能对所有 MVC 部分如何协同工作感到困惑。
首先,您不应该在控制器之间共享方法,实际上您的控制器将只有很少的代码。
Rails 将路由一个请求,并查找控制器中定义的动作,如果找不到,它将转到视图文件夹并在那里获取该动作名称的模板,例如对@987654323 的请求@ 将在控制器中查找索引操作,然后如果不存在,则查找要呈现的 views/jobs/index.erb
模板。因此,如果您提供静态数据并且不需要查找数据,您甚至不需要在控制器中执行操作。但是,通常需要该操作,因为它在控制器中进行数据库和模型查找,然后将这些实例变量传递给视图。将所有数据库查询和模型操作置于视图之外。
def index
@jobs = Job.all
end
在视图中
@jobs.each do |job| ...
respond_to
块是完全没有必要的,除非您想返回与 html 格式不同的模板,例如 web 服务的 xml 或 json。
【讨论】:
在重新格式化问题之前,我没有看到他在他的示例代码中进行了数据库查询。我的回答可能没有帮助。【参考方案2】:您尚未在管理控制器中定义 jobs
操作。您正在管理控制器的索引操作中加载 @jobs。如果您想要这项工作,请将Admin
控制器的index
操作重命名为作业并添加该路由。添加路由的一种方法是在config/routes.rb
中添加一行。
match '/jobs' => 'admin#jobs'
阅读this。
【讨论】:
我正在尝试做的是在管理区域中创建作业的索引,因此将 /jobs 映射到 admin#jobs 并没有真正的帮助。 /jobs 已经映射到作业控制器本身,因为我想向最终用户显示作业。几乎就像管理员控制器从作业控制器中看不到任何东西一样。请原谅我的回答有点愚蠢,我仍在努力掌握轨道。以上是关于从 Rails 中的其他控制器调用方法的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Ruby on Rails 的控制台中调用控制器/视图辅助方法?