Rails: ошибка при попытке доступа к модели из контроллера - PullRequest
0 голосов
/ 03 декабря 2011

Я хочу получить доступ к модели из контроллера

Путь:

/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}

Если я изменю свой файл route.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 ]

1 голос
/ 03 декабря 2011

Проблема в том, что маршруты соответствуют только входящим запросам к контроллерам. Они не имеют ничего общего с моделями сами. Однако, используя метод 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)

1 голос
/ 03 декабря 2011

Мой подход состоял бы в том, чтобы имена были более условными, что является основным принципом рельсов.

В настоящее время есть

quizzes контроллер с ... @admin_quiz переменная, которая ... Использует модель Test.

Я бы начал без пространства имен и имел бы:

quizzes контроллер с ... @quiz переменная, которая ... Использует модель Quiz.

или

tests контроллер с ... @test переменная, которая ... Использует модель Test.

и я удалил бы поля attr_accessible, если они вам не нужны из-за аутентификации или чего-то еще.

Получите все это и зафиксируйте код, затем работайте над добавлением пространства имен в.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...