关于Ruby on rails的另一个非常普遍的问题:
def destroy
@post = Post.find(params[:post_id])
@comment = @post.comments.find(params[:id])
@comment.destroy
redirect_to post_path(@post)
end
查看find方法,我用参数id调用它(我想通过REST请求传入)
现在在这里
<%= link_to 'Destroy Comment', [comment.post, comment],
method: :delete,
data:{confirm: 'Are you sure?' } %>
我使用comment.post + comment的id组装路由。对我来说,似乎是comment.post.id和comment.id是隐式给出的(魔术^^),这对我来说很好,但我试着编码它,我得到了一个例外。
为什么会那样?并且有人可以引导我到文档的正确部分,其中描述了这种行为吗?我非常迷失于红宝石所做的所有智能和自动化的东西......
谢谢!
答案 0 :(得分:1)
你混淆了两件截然不同的事情。
这是向ActiveRecord发出请求,要求查找匹配Post
的{{1}}实例:
id
下一行是使用内置的Post.find(id)
在您的视图中为给定的UrlHelper
构建HTML链接:
resource
在您的特定情况下,您将link_to 'Link Text', resource
指定为:method
。通过:delete
文件中的配置,rails会将routes.rb
嵌套资源的DELETE
请求映射到[POST, Comment]
,并传递posts_comment_path
post_id
1}}和comment.post
id
。
如果你仔细研究一下Rails源代码,这不是那么神奇。 comment
文档指出第二个参数可以接受link_to
接受的任何有效选项。 (click here for link_to docs)
url_for
文档(available here)说明了这一点:
url_for
所以,真的不是那么神奇。当你调用类似<%= url_for(@workshop) %>
# calls @workshop.to_param which by default returns the id
# => /workshops/5
# to_param can be re-defined in a model to provide different URL names:
# => /workshops/1-workshop-name
之类的东西时,看起来很有必要花费一些时间来跟踪一系列调用,因为它可以揭示你最初看到的非常复杂的内容。