我想从控制器访问模型
路径:
/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
为什么?!
谢谢!
答案 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)