【问题标题】:Why would link_to URL parameter not function properly with symbol为什么 link_to URL 参数不能与符号一起正常工作
【发布时间】:2019-03-24 21:08:55
【问题描述】:

在显示帖子的 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

显示第 6 行引发的 /home/progate/tweet_app/app/views/posts/edit.html.erb:

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

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

但好像不是这样的。

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

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    简答: 因为第一个“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 无法工作,因为帖子为零。

    【讨论】:

      猜你喜欢
      • 2021-08-18
      • 1970-01-01
      • 2021-12-06
      • 2020-09-01
      • 1970-01-01
      • 2021-12-15
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多