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