Rails 3, полиморфные ассоциации и отсутствие совпадений маршрутов

Я изучаю Rails уже около 6 недель, так что все еще нуб!

Я слежу за скринкастом Райана Бейтса о полиморфных ассоциациях, но получаю сообщение об ошибке «Нет совпадений маршрутов» при переходе к /model/xx/comments.

После двух дней хождения по кругу с этим я в полном тупике — кажется, все на месте.

Модель комментариев:

create_table "comments", :force => true do |t|
t.text     "content"
t.integer  "user_id"
t.integer  "commentable_id"
t.string   "commentable_type"
t.datetime "created_at"
t.datetime "updated_at"
end

Класс комментариев:

class Comment < ActiveRecord::Base
belongs_to :commentable, :polymorphic => true 
end

Другие модели класса:

class ModelName < ActiveRecord::Base
has_many :comments, :as => :commentable 
end

Маршруты.рб

resources :modelname, :has_many => :comments

comments_controller.rb

def index
@commentable = find_commentable  
@comments = @commentable.comments
end

private

  def find_commentable 
    params.each do |name, value|  
        if name =~ /(.+)_id$/  
            return $1.classify.constantize.find(value)  
        end  
    end  
    nil  
  end

Все это согласно учебнику, но, тем не менее, возвращает «нет совпадений маршрута».

Я пробовал альтернативное форматирование маршрутов как вложенных ресурсов.

resources :modelname do |modelname|
  modelname.resources :comments
end

Явное определение комментариев в route.rb

resources :comments

И различные комбинации терминов в route.rb

resources :modelname, :has_many => :commentables

or

resources :modelname, :has_many => :comments

or

resources :modelname, :has_many => :comments, :through => :commentable

все безуспешно.

кто-нибудь еще сталкивался с этим? Я потерялся, где начать искать.

Большое спасибо


person Andy Harvey    schedule 20.04.2011    source источник


Ответы (2)


Если вы используете Rails 3, маршрутизация выполняется по-другому. Вы указываете отношения в модели и сопоставляете свои маршруты в route.rb.

В Rails 3 у вас должен быть файл route.rb:

 resources :model do
    resources :comments
 end

Вы не должны указывать свои отношения в маршрутах. Обновите свой сервер, и вы должны получить такой маршрут, как /model/id/comments/id

person a3uge    schedule 20.04.2011
comment
Спасибо, что избавил меня от страданий. Простой, но эффективный! - person Andy Harvey; 20.04.2011
comment
Я также хотел бы добавить, что я добавил вложенный маршрут и столкнулся с той же проблемой. Затем я перезагрузил сервер, и он начал работать. Таким образом, добавление вложенных маршрутов на работающем сервере не всегда работает. :-) Перезагрузите его. - person cbmeeks; 15.07.2011

В Rails 3 все немного иначе. Чтобы получить URL-адрес modelname/id/comments, вам понадобится следующий маршрут в вашем routes.rb:

resources :modelname do
  resources :comments
end

Подробнее см. в этом руководстве по Rails.

person Michelle Tilley    schedule 20.04.2011
comment
Легко, когда знаешь как! Спасибо за указатель и полезную ссылку, сработало как шарм. - person Andy Harvey; 20.04.2011
comment
Ха-ха, это всегда так работает, да? Рад, что помог. - person Michelle Tilley; 20.04.2011