В свете я могу сделать это, и ссылка работает нормально: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
. Зачем? Как это может быть?
Попробуйте '@ post.comments.order (" vote_cnt DESC "). First.id'? (Этот код запроса, вероятно, должен находиться в контроллере, но это еще один вопрос.) – rkb
Определяли ли вы маршрут комментариев по ресурсам или соответствовали? – shingara
Извините, ребята, ошибка логики программиста. Я попробовал «rkb» с предложением ... first.id, и получил сообщение о том, что я не могу получить идентификатор объекта nil. Этот вызов link_to был в "@top_ten_posts each do | post |" петля. Поскольку они являются недавними сообщениями, у одного из них нет комментариев. Duh! Мой код должен сначала проверить это. Виноват. Однако очень сложно сказать, что link_to не даст вам четкого указания, что вы передали ему нулевой объект. «Никаких маршрутных матчей ...»?!?!?! Довольно плохое сообщение об ошибке. –