在Rails中识别对象 - 有时使用:id,有时使用对象本身?

时间:2014-01-28 00:25:47

标签: ruby-on-rails ruby activerecord

关于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是隐式给出的(魔术^^),这对我来说很好,但我试着编码它,我得到了一个例外。

为什么会那样?并且有人可以引导我到文档的正确部分,其中描述了这种行为吗?我非常迷失于红宝石所做的所有智能和自动化的东西......

谢谢!

1 个答案:

答案 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 之类的东西时,看起来很有必要花费一些时间来跟踪一系列调用,因为它可以揭示你最初看到的非常复杂的内容。