从 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: 17: 18:19: 20: 21: 22: 【参考方案1】:

从您发布的代码来看,您似乎没有使用查询从数据库中获取您想要的工作,例如

@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 中的其他控制器调用方法的主要内容,如果未能解决你的问题,请参考以下文章

如何从rails 4中的按钮调用控制器方法

Ruby on Rails - 从视图调用控制器方法

从 Rails 3 控制器调用辅助方法

如何在 Ruby on Rails 的控制台中调用控制器/视图辅助方法?

Ruby on Rails:将数据调用到 javascript 中的首选方法?

如何从 Rails 中的控制器混入和调用 link_to?