我的主要困难来自于理解_follow
和_unfollow
偏与第11.2.3章RelationshipsController
中定义的create
和destroy
方法之间的关系。我现在只关注取消关注用户的行为(因为关注的行为主要是类似的)。
hart将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
我理解有困难的是:
-
unfollow
部分第一行的@user
变量。这是a)定义在当前显示页面的show
操作中,还是b)定义在destroy
操作中?似乎form_for
助手已经找到了要销毁的@user
,那么为什么destroy
动作需要在控制器中再次找到要销毁的@user
呢? - 在
destroy
方法中,通过首先查找关系id来找到@user
。我没有看到首先如何将关系id传递到URI中(因为看到要取消关注的特定用户显示为/users/2
),更不用说如何使用它来查找要销毁的@user
了。我知道每个关系表都有一个id,一个followwed_id和一个follower_id,但不明白id元素本身如何在这里发挥作用。
谢谢你的阅读和回答我的问题!!
1。如果局部在show
操作中呈现,则必须在该操作中定义变量@user。Rails不会执行destroy
方法,因此其中的变量定义将永远不会被执行。
由于HTTP是无状态协议,服务器需要为每个请求创建必要的状态。这就是为什么@user必须在每个动作中定义。
2)。你在哪里检查url是"/users/2"?由于我没有看到整个代码,我只能猜测,但下面一行current_user.relationships.find_by_followed_id(@user)
应该返回一个Relationship
对象。它将被翻译成类似"/relationships/8"的东西,其中8是Relationship
的ID。因为你指定了' method::delete ',销毁操作将被调用。
我认为url "/users/2"是在执行销毁操作之后执行的删除操作。在销毁操作中可能有一个重定向。(如。redirect_to current_user
)。您可以在日志文件中看到所有被调用的操作。试着滚动日志,看看是否可以找到RelationshipsController#destroy
。您将在那里看到被调用的url。您还可以检查HTML,看看<form>
标记的"action"属性指向哪里。