Rails教程-第11章不理解follow/unfollow用户的实现



我的主要困难来自于理解_follow_unfollow偏与第11.2.3章RelationshipsController中定义的createdestroy方法之间的关系。我现在只关注取消关注用户的行为(因为关注的行为主要是类似的)。

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

我理解有困难的是:

  1. unfollow部分第一行的@user变量。这是a)定义在当前显示页面的show操作中,还是b)定义在destroy操作中?似乎form_for助手已经找到了要销毁的@user,那么为什么destroy动作需要在控制器中再次找到要销毁的@user呢?
  2. 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"属性指向哪里。

相关内容

  • 没有找到相关文章

最新更新