1

В свете я могу сделать это, и ссылка работает нормально:Rails 3.1 - link_to генерирует «маршрут не соответствует» ошибка на <ActiveRecord :: Relation> .first

<%= link_to "Most popular comment", comment_path(Comment.find(5)) %> 

Так что я знаю, что мои маршруты настроены для отображения отдельной записи комментария через comment_path(). Однако, когда я пытаюсь это:

<%= link_to "Most popular comment", comment_path(@post.comments.order("vote_cnt DESC").first) 

я получаю "No route matches {:action=>"show", :controller=>"comments"}" ошибка. Но я знаю, что это не точное описание ошибки, потому что работает первый описанный выше оператор link_to(). Я подтвердил, что маршрут существует - от rake routes я получаю это:

comment GET /comments/:id(.:format) {:action=>"show", :controller=>"comments"} 

В IRB я могу видеть, что эти два заявления я передаю в comment_path() как генерировать тот же класс, а именно «Comment»:

irb(main):022:0> top_comment = post.comments.order("vote_cnt DESC").first 
    Comment Load (0.6ms) SELECT "comments".* FROM "comments" WHERE "post_id" = 2 ORDER BY vote_cnt DESC LIMIT 1 
=> #<Comment id: 5, heading: nil, body: nil, user_id: 5, created_at: "2012-02-03 01:23:30", updated_at: "2012-02-03 01:23:30",vote_cnt: 0> 

irb(main):023:0> top_comment.class 
=> Comment(id: integer, heading: string, body: text, user_id: integer, created_at: datetime, updated_at: datetime, vote_cnt: integer) 

irb(main):024:0> comment_5 = Comment.find(5) 
    Comment Load (3.2ms) SELECT "comments".* FROM "comments" WHERE "comments"."id" = $1 LIMIT 1 [["id", 5]] 
=> #<Comment id: 5, heading: nil, body: nil, user_id: 5, created_at: "2012-02-03 01:23:30", updated_at: "2012-02-03 01:23:30", vote_cnt: 0> 

irb(main):025:0> comment_5.class 
=> Comment(id: integer, heading: string, body: text, user_id: integer, created_at: datetime, updated_at: datetime, vote_cnt: integer) 

Если оба оператора генерируют один и тот же класс объекта, то как link_to() работать с ним и вызывать ошибку маршрута на другом, особенно когда оба разрешают одну и ту же точную запись? Я пробовал:

<% top_comment = post.comments.order("vote_cnt DESC").first %> 
<%= link_to "Most popular comment", comment_path(top_comment) 

И это порождает ошибку «Нет пути соответствует ...».

Любые идеи, что здесь происходит? Кажется, что link_to() хорошо работает с записью, которая исходит из прямого запроса к таблице, но ошибки на той же самой записи, если она была получена с помощью действия ActiveRecord::Relation. Зачем? Как это может быть?

+1

Попробуйте '@ post.comments.order (" vote_cnt DESC "). First.id'? (Этот код запроса, вероятно, должен находиться в контроллере, но это еще один вопрос.) – rkb

+0

Определяли ли вы маршрут комментариев по ресурсам или соответствовали? – shingara

+0

Извините, ребята, ошибка логики программиста. Я попробовал «rkb» с предложением ... first.id, и получил сообщение о том, что я не могу получить идентификатор объекта nil. Этот вызов link_to был в "@top_ten_posts each do | post |" петля. Поскольку они являются недавними сообщениями, у одного из них нет комментариев. Duh! Мой код должен сначала проверить это. Виноват. Однако очень сложно сказать, что link_to не даст вам четкого указания, что вы передали ему нулевой объект. «Никаких маршрутных матчей ...»?!?!?! Довольно плохое сообщение об ошибке. –

ответ

1

[преобразование моего комментария выше в ответ]

Извините, ребята - программист логической ошибки.

Я попробовал «rkb» с предложением ... first.id, и получил сообщение о том, что я не могу получить идентификатор объекта nil. Этот вызов был link_to в цикле:

@top_ten_posts each do |post| 
... 
end 

Поскольку они являются недавние сообщения, один из них не имел каких-либо комментариев. Duh! Мой код должен сначала проверить это.

Плохо. Однако очень сложно сказать, что link_to не даст вам четкого указания, что вы передали ему нулевой объект. «Никаких маршрутных матчей ...»?!?!?! Довольно плохое сообщение об ошибке для ситуации!

1

Хорошо, это странно. Вы проверили, что вернулось на @post.comments.order("vote_cnt DESC").first на ваш взгляд (либо путем его печати, либо debugger/pry)?

+0

Спасибо за предложение ksol.Я бы увидел запись nil (см. Мой комментарий выше), если бы я попробовал ее распечатать. Очень трудно получить «отладчик», работающий на моей установке ruby ​​1.9.3, или я бы попробовал это в первую очередь. Спасибо, что KISS предлагает просто использовать «puts». –

+0

Некоторое время назад я отошел от «отладчика». Использование 'pry' очень просто и круто, вы должны дать ему выстрел :) – ksol

+0

Я загрузил pry, и это действительно очень мощный. Единственное, чего не хватает, это шаг/следующая функциональность. Googling показывает пару возможных решений для этого, но они выглядят отрывочно/без поддержки. Есть ли конкретное решение, которое вы бы рекомендовали получить с помощью pry? –