2015-03-12 3 views
0

Работа через «Ruby on rails 3 essential training» Я столкнулся с проблемой с моими маршрутами и URL-адресами. Я создал sujects_controller с действием «list» и «show». В моем локальном хосте, когда я вхожу в: localhost: 3000.subjects/list, я получаю сообщение об ошибке, 'не удалось найти тему с id = list' Но когда я вхожу в: localhost: 3000.subjects. Я получаю список, который должен был появиться при вводе первого URL-адреса. Кроме того, после ввода этого второго URL-адреса у меня есть ссылки для Show, Edit и Delete. Когда я наводил указатель мыши на ссылку «Показать» в нижней части страницы, будущий вывод читает localhost.3000/subject (3). Эта ссылка работает. Но, согласно инструкциям моих инструкторов, он должен читать, localhost.3000/themes/show/3. По каким-то причинам мои ссылки и/или действия не работают должным образом, и я не уверен, почему, поскольку я следую инструкциям.CRUD в рубине на рельсах. Маршрутизация

Вот мой subjects_controller.rb файл:

class SubjectsController < ApplicationController 

def index 
    list 
    render('list') 
end 

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

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

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

def new 
    @subjects = Subject.new 
end 

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

    if @subject.save 

    redirect_to(:action => 'list') 
    else 

    render('new') 
    end 

end 

    end 

Вот мой list.html и show.html файл:

<div class="subject list"> 
<h2>Subjects</h2> 

<table class="listing" summary="Subject list"> 
    <tr class="header"> 
     <th>&nbsp;</th> 
     <th>Subject</th> 
     <th>Visible</th> 
     <th>Pages</th> 
     <th>Actions</th> 
    </tr> 
    <% @subjects.each do |subject| %> 
    <tr> 
     <td><%= subject.position %></td> 
     <td><%= subject.name %></td> 
     <td class="center"><%= subject.visible ? 'yes' : 'no' %></td> 
     <td class="center"><%= subject.pages.size %></td> 
     <td class="actions"> 
      <%= link_to("Show", {:action => 'show', :id => subject.id}, :class => 'action show') %> 
      <%= link_to("Edit", '#', :class => 'action edit') %> 
      <%= link_to("Delete", '#', :class => 'action delete') %> 
     </td> 
    </tr> 
    <% end %> 
</table> 

Show.html

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

    <div class="subject show"> 
     <h2>Show Subject</h2> 

     <table summary="Subject detail view"> 
      <tr> 
       <th>Name</th> 
       <td><%= @subject.name %></td> 
      </tr> 
      <tr> 
       <th>Position</th> 
       <td><%= @subject.position %></td> 
      </tr> 
      <tr> 
       <th>Visible?</th> 
       <td><%= @subject.visible ? 'true' : 'false' %></td> 
      </tr> 
      <tr> 
       <th>Created</th> 
       <td><%= @subject.created_at %></td> 
      </tr> 
      <tr> 
       <th>Updated</th> 
       <td><%= @subject.updated_at %></td> 
      </tr> 
     </table> 

    </div> 

И мой файл config/routes.rb:

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

инструктор никогда не показывает его routes.rb файл, так что я только начал с помощью получает, чтобы получить мои действия на работу. Ресурсы: субъекты не могли позаботиться обо всем, поэтому я использовал GET. Также в моем subject_controller я def: индекс для отображения списка. Если я этого не сделаю, ничего не получится. Я, очевидно, новичок во всем этом, но люблю узнавать об этом, и любая информация ценится. Я посмотрел на рельсы, направляющиеся от гидов, но это не помогло мне. Это больше понятие/теория, почему мои ссылки/действия не работают, о которых мне было бы очень интересно услышать. Спасибо за любую информацию!

ответ

2

При указании в маршрутах

resources :subjects Это создает семь действий (индекс, новое, создавать, создавать, шоу, редактировать, обновлять, уничтожить)

Когда вы звоните localhost:3000/subjects это спросить маршруты, куда идти ,И index действия называется

/subjectssubjects#index дисплея список всех предметов

И когда вы говорите localhost:3000/subjects/list Он ожидает id после /subjects как есть маршруты, отображенные на этом

localhost:3000/subjects/5 когда вы будете называть это он вызовет метод show в контроллере с запросом на запись с идентификатором 5 в базе данных /subjects/:idsubjects#show

Если вы хотите увидеть все маршруты, от консольного типа rake routes

И если вы хотите, чтобы определить дополнительный метод, как list ниже

get 'subjects/list' => 'subjects#list'

и удалить все другие маршруты для list из маршрутов файл

И еще есть возможность указать routes и узнать, что это ваш лучший друг

http://guides.rubyonrails.org/routing.html

+0

Хорошо это начинает иметь смысл, но я до сих пор немного путать. В моем файле confiq/routes.rb у меня есть «предметы/список» => «предметы # список», за которыми следуют ресурсы: предметы. Теперь, с моего сервера, если я вхожу в localhost.3000/subject/list, все работает нормально. Но когда я наводил указатель мыши на шоу, он все еще не говорит localhost.3000/themes/show5. Но вместо этого localhost.3000/subject/5. Как я могу показать действие шоу в моем URL-адресе. Как я должен маршрутизировать файл routed.rb, чтобы сделать это –

+0

Я не уверен, почему это происходит, но я думаю, что эта строка в вашем 'routes.rb'' get 'subject/list' => 'subject # show'' и remove это тоже 'get 'themes/create' => 'themes # create'' – Sontya

1

Проблема заключается в вашем файле routes.rb. При указании resources :subjects вы добавляете много маршрутов, один из которых является get 'subjects/:id' => 'subjects#show'

Поскольку маршруты имеют приоритет в зависимости от того, вы пишете их (сверху вниз) это переписав get 'subjects/list' => 'subjects#list' линии.

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

get 'subjects/list' => 'subjects#list' 
    get 'subjects/list' => 'subjects#show' 

предметы # показать никогда не будет называться, так как маршрут вызова субъектов # список будет иметь приоритет

+0

Спасибо вам большое за помощь.Я работаю пару часов, а затем я собираюсь вернуться домой и привести в порядок эти маршруты. Спасибо! –

1

Это потому, что вы первый decleared

 resources :subjects 

, а затем другие маршруты.

В вашем случае самый лучший способ, чтобы добавить маршруты к ресурсу является следующее:

resources :subjects do 
    collection do 
     get :list, to: :show 
    end 
end 

Это будет генерировать:

# rake routes 
list_subjects GET /subjects/list(.:format)  subjects#show 
    subjects GET /subjects(.:format)   subjects#index 
       POST /subjects(.:format)   subjects#create 
    new_subject GET /subjects/new(.:format)  subjects#new 
edit_subject GET /subjects/:id/edit(.:format) subjects#edit 
     subject GET /subjects/:id(.:format)  subjects#show 
       PATCH /subjects/:id(.:format)  subjects#update 
       PUT /subjects/:id(.:format)  subjects#update 
       DELETE /subjects/:id(.:format)  subjects#destroy 
Смежные вопросы