Rails:当我尝试从控制器访问模型时出错

时间:2011-12-03 12:21:41

标签: ruby-on-rails

我想从控制器访问模型

路径:

/controllers
    /admin
        quizzes_controller.rb
/models
    test.rb

控制器:

class Admin::QuizzesController < ApplicationController

    ...

    def new
        @admin_quiz = Test.new

        respond_to do |format|
            format.html # new.html.erb
            format.json { render :json => @admin_quiz }
        end
    end

    ...
end

型号:

class Test < ActiveRecord::Base
    attr_accessible :name, :description, :random_answers, :random_questions, :time_limit

    ...
end

路线:

Quiz::Application.routes.draw do
    namespace :admin do 
        resources :tests, :quizzes
    end

    ...
end

当我尝试访问http://localhost:3000/admin/quizzes/new时,出现此错误:

No route matches {:controller=>"tests", :format=>nil}

如果我将routes.rb文件更改为:

Quiz::Application.routes.draw do
    namespace :admin do 
        resources :quizzes
    end

    resources :tests

    ...
end

我可以访问http://localhost:3000/admin/quizzes/new但是当我提交表单时,我收到此错误:

uninitialized constant TestsController

为什么?!

谢谢!

2 个答案:

答案 0 :(得分:1)

我的方法是保持名称更基于惯例,这是核心轨道原则。

目前有

一个quizzes控制器......  一个@admin_quiz变量......  使用Test模型。

我会在没有命名空间的情况下开始并且有:

一个quizzes控制器......  一个@quiz变量......  使用Quiz模型。

一个tests控制器......  一个@test变量......  使用Test模型。

我将删除attr_accessible字段,除非您因身份验证而需要它们。

让它全部工作并提交代码,然后继续添加命名空间。

答案 1 :(得分:1)

问题是路由只匹配传入的控制器请求。它们与模型本身无关。但是,使用resources方法,您告诉rails有一个控制器响应7个REST方法,名为'model'sController。在您的情况下,您说管理命名空间中有TestsController和QuizzesController。

提交表单时的错误取决于您告知要提交的表单的内容。如果未在form_for帮助程序中指定某个路径,则rails将使用该模型来确定路径。在您的情况下,TestsController #new,因为您(可能)传递了一个Test实例。

但是,您可以通过传递form_for选项来更改:url的操作。有关详细信息,请查看api。请注意,使用命名空间时情况会有所不同:

<%Q form_for([:admin, @post]) do |f| %>
 ...
<% end %>

(来自api)