从rails中的其他控制器调用方法

时间:2011-02-20 13:42:47

标签: ruby-on-rails ruby-on-rails-3 view controller

我正在尝试从另一个控制器中调用方法并获取无方法错误。

所以我有两个控制器作业和管理员,我试着打电话:

<% @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,所以我应该如何将作业控制器包含在管理员中呢?

2 个答案:

答案 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