Маршрут не соответствует ни одному контроллеру, покажите - сгенерированный скаффолдом код - PullRequest
6 голосов
/ 30 января 2011

Я запустил приложение Rails, используя скаффолд. Приложение связывает людей с учреждениями. Когда я иду к

http://localhost:3000/people

Я получаю следующую ошибку:

No route matches {:controller=>"people", :action=>"show", :id=>#<Person pid: 302, name: 

(и так далее)

Если я удаляю все ячейки "link_to" в сгенерированной скаффолдом таблице, страница загружается просто отлично. Эта ошибка возникает для всех файлов index.html.erb в моем приложении.

Вот мои люди / index.html.erb

<h1>Listing people</h1>

<table>   <tr>  <th></th>
    <th></th>
    <th></th>
    <th></th>   </tr>

<% @people.each do |person| %>   <tr>   <td><%= person.name %></td>
    <td><%= link_to 'Show', person %></td>
    <td><%= link_to 'Edit', edit_person_path(person) %></td>
    <td><%= link_to 'Destroy', person, :confirm => 'Are you sure?', :method
=> :delete %></td>   </tr> <% end %> </table>

<br />

<%= link_to 'New Person', new_person_path %>

И начало моих контролеров / people.rb

class PeopleController < ApplicationController
  # GET /people
  # GET /people.xml
  def index
    @people = Person.all(:order => "year_grad, name")

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @people }
    end
  end

  # GET /people/1
  # GET /people/1.xml
  def show
    @person = Person.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @person }
    end
  end

и результаты рейк-маршрутов

people GET    /people(.:format)                {:controller=>"people", :action=>"index"}
POST   /people(.:format)                {:controller=>"people", :action=>"create"}
new_person GET    /people/new(.:format)            {:controller=>"people", :action=>"new"}
edit_person GET    /people/:id/edit(.:format)       {:controller=>"people", :action=>"edit"}
person GET    /people/:id(.:format)            {:controller=>"people", :action=>"show"}
PUT    /people/:id(.:format)            {:controller=>"people", :action=>"update"}
DELETE /people/:id(.:format)            {:controller=>"people", :action=>"destroy"}
home_index GET    /home/index(.:format)            {:controller=>"home", :action=>"index"}
root        /(.:format)                      {:controller=>"home", :action=>"index"}

и миграция для людей

class CreatePeople < ActiveRecord::Migration
  def self.up
    create_table :people, :id => false, :primary_key => :pid do |t|
      t.integer :pid, :null =>false
      t.string :name
      t.string :degree
      t.integer :phd_area
      t.string :thesis_title
      t.integer :year_grad
      t.integer :instid_phd
      t.integer :year_hired
      t.integer :instid_hired
      t.integer :schoolid_hired
      t.integer :deptid_hired
      t.string :email
      t.string :notes
      t.integer :hire_rankid
      t.integer :tenure_track
      t.integer :prev_instid
      t.integer :prev_rankid
    end
  end

  def self.down
    drop_table :people
  end
end

и вот мой файл rout.rb (за вычетом закомментированных строк, которые генерирует скаффолдинг автоматически):

IHiring::Application.routes.draw do
  resources :ranks, :departments, :institutions, :schools, :people

  get "home/index"
  root :to => "home#index"

end

Имеет ли это какое-то отношение к установке другого primary_key для таблицы? Я не уверен, что это проблема модели или маршрута. Или что-то, о чем я не думал. Я перезапустил свой сервер rails после установки лесов.

Ответы [ 3 ]

13 голосов
/ 30 января 2011

Попробуйте использовать person_path(person) вместо person в ссылках Показать и Удалить.

Редактировать : я не заметил, что вы используете первичный ключ, отличный отпо умолчанию id.Попробуйте использовать person_path(person.pid) вместо person_path(person).

1 голос
/ 30 марта 2012

Несмотря на то, что это был не ваш случай, я несколько часов пытался решить эту проблему, не понимая, что на земле было не так.

Код был сгенерирован из скаффолда, он работал раньше, но внезапно перестал работать. Перестало работать только действие индекса со следующей ошибкой:

No route matches {:action=>"show", :controller=>"users", :id=>"...."}

Причиной для меня было не то, что у меня был другой идентификатор (у меня был set_primary_key "username", и это заставляло остальные работать без изменений), но я ввел идентификатор с точкой : "test.est", и это доставляло мне много хлопот.

Итак, теперь все мои строковые идентификаторы будут иметь (пока я не найду регулярное выражение, которое принимает акценты (текст ...):

validates_format_of :username, :with => /^[-A-Za-z0-9]+$/
1 голос
/ 09 марта 2012

, поскольку вы выбрали другой pk, чем по умолчанию для рельсов ('id'), вам нужно будет указать вашей модели использовать его вместо этого.

class Person < ActiveRecord::Base

  set_primary_key "pid"

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