Rails教程 - 在第11章中不了解跟随/取消关注用户的实现

时间:2012-12-31 00:39:18

标签: ruby-on-rails-3 ruby-on-rails-3.2 railstutorial.org

我的主要困难来自于了解_follow_unfollow部分与create中定义的destroyRelationshipsController方法之间的关系{ {3}}。我现在只关注取消关注用户的行为(因为跟随行为大多类似)。

Hartl定义了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部分..的第一行中的unfollow变量是当前显示该页面的show操作中定义的 a), {em>或 b)destroy行动中定义了?似乎form_for助手已经找到要销毁的@user,为什么destroy操作需要再次找到@user以便在控制器中销毁?
  2. destroy方法中,首先找到关系ID,找到@user。我没有看到关系ID如何首先传递到URI(因为看到特定用户取消关注显示为/users/2),更不用说它如何用于查找@user摧毁。我知道每个Relationship表都有一个id,一个follow_id和一个follower_id,但是看不到id元素本身是如何发挥作用的。
  3. 感谢您的阅读和回答我的问题!!

1 个答案:

答案 0 :(得分:1)

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

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

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

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