为什么link_to URL参数不能与符号

时间:2019-03-24 21:08:55

标签: ruby-on-rails

在显示帖子的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不起作用?

1 个答案:

答案 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无效,因为帖子为零。