ruby-on-rails - 为什么 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 不起作用?
解决方案
简短的回答:因为第一个“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 为零,因此无法工作。
推荐阅读
- python - 了解 CTC 的 TF 实现是如何工作的
- sas - 如何检测和修改SAS中的小写字母
- angularjs - angularjs继承objectprototype只能是对象或者null
- amazon-web-services - 一旦 EC2 实例与它一起启动,以编程方式从 AWS 下载 RDP 文件 java sdk
- cmake - 如何在简单的 CMake 项目中添加 include_directory
- javascript - 登录 我尝试了不同的代码 几乎总是发生相同的事情 可能有任何带有 cookie 的东西
- ruby-on-rails - 通过rails中的关联显示has_many
- amazon-web-services - AWS WAF 如何按低于 2000 个请求/分钟的最小值对 IP 限制路径进行评级
- google-apps-script - 使用 Google Apps 脚本格式化 gmail 的正文
- c# - 是否可以从在线共享点上存储的 Excel 表中提取数据?