Rails 3.1 - link_to генерирует ошибку «нет совпадений маршрута» в <ActiveRecord :: Relation> .first - PullRequest
1 голос
/ 17 февраля 2012

В представлении я могу это сделать, и ссылка работает нормально:

<%= 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. Зачем? Как это может быть?

Ответы [ 2 ]

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

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

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

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

@top_ten_posts each do |post|
...
end

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

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

1 голос
/ 17 февраля 2012

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

...