2015-03-11 5 views
1

Я работаю над «Ruby on rails essential 3 training» на lynda.com. Я собираюсь создавать формы и внедрять CRUD. Пока всякий раз, когда я пытаюсь запустить рельсы, он никогда не сможет найти определение.GET ошибки в рубине на рельсах. Контроллеры и действия. CRUD

Чтобы решить эту проблему, я определяю действие внутри контроллера, а затем создаю GET в файле routes.rb. Мой инструктор не должен этого делать, и его сервер начинает нормально. У меня такое чувство, что я делаю что-то неправильно, потому что у моего файла route.rb есть много команд GET.

Пожалуйста, ознакомьтесь со следующими папками и дайте мне знать, если у вас есть идея, почему я должен делать GET каждый раз, когда я пытаюсь выполнить новое действие. Я слышал, что при создании модели предполагается создание GET одновременно, но этого не происходит, и я не уверен, правильно ли я это понимаю. Мои подданные контроллер:

class SubjectsController < ApplicationController 

def index 
    list 
    render('list') 
end 

# def index 
# show 
# render('show') 
# end 

def list 
    @subjects = Subject.order("subjects.position ASC") 
end 

def show 
    @subject = Subject.find(params[:id]) 
end 

def new 
    @subject = Subject.new 

end 

def create 

end 

конец

Мой new.html.erb файл:

<%= link_to("<< Back to List", {:action => 'list'}, :class => 'back-   link') %> 

    <div class="subject new"> 
     <h2>Create Subject</h2> 

     <%= form_for(:subject, :url => {:action => 'create'}) do |f| %> 

      <table summary="Subject form fields"> 
       <tr> 
      <th>Name</th> 
      <td><%= f.text_field(:name) %></td> 
     </tr> 
     <tr> 
      <th>Position</th> 
      <td><%= f.text_field(:position) %></td> 
     </tr> 
     <tr> 
      <th>Visible</th> 
      <td><%= f.text_field(:visible) %></td> 
     </tr> 
    </table> 

    <div class="form-buttons"> 
     <%= submit_tag("Create Subject") %> 
    </div> 
<% end %> 

Мой конфиг/routes.rb

Rails.application.routes.draw do 
     root :to=>"demo#index" 
     get 'demo/index' 
     get 'demo/hello' 
     get 'demo/other_hello' 
     get 'subjects/list' 
     get 'subjects/show' 
     get 'subjects/new' 
     get 'subjects/create' 

Теперь имея проблема с частью создания Crud при попытке создать тестовый объект. Вот мой SubjectsController.rb

class SubjectsController < ApplicationController 

def index 
    list 
    render('list') 
end 

# def index 
# show 
# render('show') 
# end 

def list 
    @subject = Subject.order("subjects.position ASC") 
end 

def show 
    @subject = Subject.find(params[:id]) 
end 

def new 
    @subject = Subject.new 
end 

def create 
    @subject = Subject.new(params[:subject]) 

    if @subject.save 

    redirect_to(:action => 'list') 
    else 

    render('new') 
    end 

end 

    end 
+0

пожалуйста отправьте сообщение об ошибке, что вы получаете –

ответ

2

Да, вам не нужно указать GET для CRUD действий. Вы можете использовать Rails Resource Routing. Например, ваши subjects действия контроллера могут быть вызваны routes.rb так:

resources: subjects 

Это будет автоматически маршрутизировать все общие действия CRUD, и искать их в контроллере. Вы можете видеть, что рельсы «подняли» вашу маршрутизацию, введя rake routes в командной строке. Вы также можете ограничить количество необходимых действий, пройдя resources: subjects, only:[:destroy]. Это говорит Rails использовать только действие subjects#destroy. Это еще не все. Я предлагаю прочитать через this RailsGuide для получения дополнительной информации

2

Вот что ваш конфигурационный/routes.rb должен выглядеть следующим образом:

root 'subjects#index' 
resources :subjects 
get 'subjects/list' => 'subjects#list' 
+0

Спасибо за ответы на все вопросы и ресурсы это действительно выручает много и делает много смысл. –

+0

Рад, что ты ловишь Сэма. Rails довольно круто! –

+0

Итак, теперь я застрял на создании части Круда. Я смог исправить свою маршрутизацию, так что мой сервер работает, но когда я пытаюсь создать тему теста, я получаю ошибку Forbidden Attributes. Я напишу свой файл SubjectsController.rb в своем исходном вопросе, если вы можете взглянуть на него. Я следовал за инструктором, но я предполагаю, что это снова проблема маршрутизации или отсутствие определения «create» или «params». –

2

Как правило, вам необходимо создать маршруты самостоятельно. Они не созданы с помощью модели. Кроме того, они скорее связаны с контроллером, чем с моделью.

Я рекомендую посмотреть официальную направляющую маршрутизации Rails here. Обычно что-то вроде темы/create - это не GET, а POST-маршрут. Ваш инструктор мог также использовать маршрут resources :subjects вместо нескольких GET/POST/и т. Д. маршруты.

1

Плавный вариант @ ответ OhHendrie, используя только DSL ресурсы

root 'subjects#index' 
resources :subjects do 
    get 'list', on: :collection 
end 
Смежные вопросы