Почему параметр URL link_to не работает должным образом с символом - PullRequest
1 голос
/ 25 марта 2019

В html.erb (называемом show.html.erb), в котором отображается сообщение, я добавляю link_to для его редактирования. Есть только одна строка изменений, которую я сделал

не работает

<%= link_to("edit", "/posts/:id/edit") %>

работает

<%= link_to("edit", "/posts/#{@post.id}/edit") %>

Для маршрутов у меня есть

get "posts/:id/edit => "posts#edit"

В контроллере,

  def edit
    @post = Post.find_by(id: params[:id])
  end

в edit.html.erb, у меня есть

<textarea><%= @post.content %></textarea>
<input type="submit" value="save">

NoMethodError в сообщениях # edit

Отображение /home/progate/tweet_app/app/views/posts/edit.html.erb, где поднята строка # 6:

неопределенный метод `content 'для nil: NilClass

С моим ограниченным знанием Rails я понимаю, что, поскольку в контроллере я определяю @post с помощью find_by, я бы предположил, что URL ссылки может использовать символ: id.

Но, похоже, дело не в этом.

Почему link_to с: id не работает?

1 Ответ

1 голос
/ 25 марта 2019

Краткий ответ: потому что первый «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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...