В представлении я могу это сделать, и ссылка работает нормально:
<%= 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
. Зачем? Как это может быть?