0

我的主要困难来自于理解 the _followand _unfollowpartials 与第 11.2.3 章中定义的and方法create之间destroy的关系。我现在只关注取消关注用户的行为(因为关注的行为大多是类似的)。RelationshipsController

Hartl 将部分 for 定义unfollow为:

<%= form_for(current_user.relationships.find_by_followed_id(@user), html: { method: :delete }) do |f| %> 
    <%= f.submit "Unfollow", class: "btn btn-large" %>
<% end %>

以及相应的destroy操作:

def destroy
    @user = Relationship.find(params[:id]).followed
    current_user.unfollow!(@user)
    redirect_to @user
end

我难以理解的是:

  1. 部分 ..@user第一行中的变量是a)在当前显示页面的操作中定义的,还是b)在操作中定义的?看来helper 已经找到要销毁的了,那为什么action 还需要在控制器中重新找到要销毁的呢?unfollowshow destroyform_for@userdestroy@user
  2. 在该destroy方法中,@user首先找到Relationship id。我没有看到关系 id 首先是如何传递到 URI 中的(因为看到要取消关注的特定用户显示为/users/2),更不用说它是如何用于查找@user要销毁的了。我知道每个关系表都有一个 id、一个 follower_id 和一个 follower_id,但看不到 id 元素本身是如何在这里发挥作用的。

感谢您阅读并回答我的问题!

4

1 回答 1

1

1.) 如果在操作中呈现部分内容show,则必须在该操作中定义变量 @user。Rails 不会执行该destroy方法,因此其中的变量定义将永远不会被执行。

由于 HTTP 是无状态协议,服务器需要为每个请求创建必要的状态。这就是为什么必须在每个操作中定义@user。

2.) 你在哪里检查 url 是“/users/2”?由于我没有看到整个代码,我只能猜测,但以下行current_user.relationships.find_by_followed_id(@user)应该返回一个Relationship对象。它将被翻译成类似“/relationships/8”的东西,其中 8 是Relationship. 因为您指定了 `method: :delete,所以将调用销毁操作。

我认为 url "/users/2" 是在执行销毁操作之后执行删除。销毁操作中可能存在重定向。(例如。redirect_to current_user)。您可以在日志文件中看到所有调用的操作。尝试滚动浏览日志,看看是否可以找到RelationshipsController#destroy. 您将在那里看到调用的 url。您还可以检查 HTML 以查看<form>标记的“动作”属性指向的位置。

于 2012-12-31T01:57:39.747 回答