在显示帖子的html.erb(称为show.html.erb)中,我添加了link_to以编辑帖子。我只做了一行更改
不起作用
<%= link_to("edit", "/posts/:id/edit") %>
有效
<%= link_to("edit", "/posts/#{@post.id}/edit") %>
对于route.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
在第6行出现的位置显示/home/progate/tweet_app/app/views/posts/edit.html.erb:
nil:NilClass的未定义方法“内容”
由于对Rails的了解有限,所以我了解到,因为在控制器中,我正在使用find_by定义@post,所以我可以想象链接URL可以使用符号:id。
但事实并非如此。
为什么带有:id的link_to不起作用?
答案 0 :(得分:1)
简短答案: 因为第一个'link_to'确实将您带到'www.yoursite.com/posts/:id/edit',而第二个使用了“ String Interpolation”来替换#{}块,并将其中的红宝石代码替换为其中的。在这种情况下,正确的帖子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") %>
第二个有效的原因是它使用String Interpolation将帖子的ID注入link_to;
<%= link_to("edit", "/posts/#{@post.id}/edit") %>
成为;
<%= link_to("edit", "/posts/1/edit") %>
,然后找到ID为1的帖子并进行编辑。
出现错误的原因是,在没有插值的第一个中,没有找到帖子,因此post.content
无效,因为帖子为零。