首页 > 解决方案 > 为什么 link_to URL 参数不能与符号一起正常工作

问题描述

在显示帖子的 html.erb(称为 show.html.erb)中,我添加了一个 link_to 以编辑帖子。我只做了一行更改

不工作

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

作品

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

对于 routes.rb,我有

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 行提出:

nil:NilClass 的未定义方法“内容”

由于我对 Rails 的了解有限,我知道因为在控制器中,我使用 find_by 定义 @post,我想链接 URL 可以使用符号 :id。

但似乎情况并非如此。

为什么带有 :id 的 link_to 不起作用?

标签: ruby-on-rails

解决方案


简短的回答:因为第一个“link_to”实际上是带你到“www.yoursite.com/posts/:id/edit”,而第二个使用称为“字符串插值”的东西用 ruby​​ 代码替换 #{} 块在里面。在这种情况下,正确的帖子 ID 会将您带到“www.yoursite.com/posts/1/edit”或帖子的任何 ID。

长答案:当您创建路线时

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

":id" 只是其他东西的替代品并成为一个参数,因此当您使用字符串文字 ("/posts/:id/edit") 创建 link_to 时,您需要编辑 ID 为 " 的帖子:ID”;

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

第二个有效,因为它使用字符串插值将帖子的 ID 注入到 link_to;

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

变成;

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

然后找到一个 ID 为 1 的帖子并对其进行编辑。

您收到错误的原因是因为在第一个没有插值的情况下,它没有找到帖子,所以post.content由于 post 为零,因此无法工作。


推荐阅读