Rails 3.0.10 - Вложенный маршрут не работает правильно - PullRequest
0 голосов
/ 09 января 2012

Список кодов контроллера внизу страницы

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

Когда я посещаю URL: localhost:3000/authors/1/books Я получаю ВСЕ книги, а не книги, которые соответствуют автору с идентификатором = 1.

Вот мой код:

У меня есть Автор модель и контроллер и Книга Автор и контроллер:

class Author < ActiveRecord::Base
  has_many :books
end


class Book < ActiveRecord::Base
  belongs_to :author
end

Файл маршрутов выглядит так:

resources :authors do
    resources :books    
  end

Вот миграция для Книг:

class CreateBooks < ActiveRecord::Migration
  def self.up
    create_table :books do |t|
      t.string :title
      t.integer :author_id

      t.timestamps
    end
  end

  def self.down
    drop_table :books
  end
end

Содержит атрибут для author_id

У меня также есть этот код в файле Books _form.html.erb:

<div class="field">
    <%= f.label :author_id %><br />
    <%= f.collection_select(:author_id, Author.all, :id, :first_name) %>
  </div>

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

Когда я запускаю rake routes, я получаю это как один из маршрутов:

author_books GET    /authors/:author_id/books(.:format)

Но, когда я пробую этот URL - я просто получаю список ALL книг. Не книги, соответствующие собственному автору.

Кроме того, у меня есть мои контроллеры, настроенные на возврат JSON, и когда я помещаю localhost:3000/authors.json, он возвращает правильный объект JSON, но когда я ставлю localhost:3000/authors/1/books.json, он возвращает ' null '

Вот снимок экрана с моими текущими списками баз данных, чтобы показать, что данные точно есть:

enter image description here

Можете ли вы увидеть что-то, что может быть причиной проблемы ??? Я могу предоставить больше кода, если вам это нужно.


EDIT

После запуска rails console я получаю правильные данные - поэтому я не уверен, почему маршрут все еще не работает:

irb(main):002:0> Author.find(1).books
=> [#<Book id: 1, title: "Carrie", author_id: 1, created_at: "2012-01-08 21:20:57", updated_at: "201
2-01-08 21:20:57">]

Вот список полных маршрутов: https://gist.github.com/1580058

Вот контроллер Books: https://gist.github.com/1580064

Вот контроллер Авторы: https://gist.github.com/1580134

Извините, только что понял, что неправильно сформулировал первоначальный вопрос - я получаю весь список Книг , а не Авторов - исправлено

1 Ответ

2 голосов
/ 09 января 2012

Вы должны показать нам свое действие индексации в контроллере. Я предполагаю, что у вас есть Book.all ... Вам нужно

@author = Author.includes(:books).find(params[:author_id])

Вы также можете захотеть

@books = @author.books

Также в вашем методе show убедитесь, что вы делаете это

@author = Author.find(params[:author_id])
@book = @author.books.find(params[:id])

вместо

@book = Book.find(params[:id])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...