Краткий ответ: потому что первый «link_to» буквально переводит вас на «www.yoursite.com/posts/:id/edit», а второй использует «Строковую интерполяцию» для замены блока # {} наРубиновый код внутри него.В этом случае правильный идентификатор сообщения переместит вас на «www.yoursite.com/posts/1/edit» или любой другой идентификатор сообщения.
Длинный ответ: при создании маршрута
get "posts/:id/edit => "posts#edit"
То, что ": id" является просто заменой чего-то другого и становится параметром, поэтому, когда вы создаете link_to, используя строковые литералы ("/ posts /: id / edit"), вам нужно отредактироватьсообщение с идентификатором ": id";
<%= link_to("edit", "/posts/:id/edit") %>
Второй работает, потому что использует интерполяцию строк для вставки идентификатора сообщения в link_to;
<%= link_to("edit", "/posts/#{@post.id}/edit") %>
становится;
<%= link_to("edit", "/posts/1/edit") %>
, а затем находит сообщение с идентификатором 1 и редактирует его.
Причина, по которой вы получаете сообщение об ошибке, заключается в том, что в первом случае без интерполяции он не находит сообщение, поэтому post.content
не может работать, поскольку сообщение равно nil.