0

_follow私の主な難しさは、と_unfollowパーシャルが第11.2.3章から定義されたcreateとメソッドとの関係を理解することから来ています。今のところ、ユーザーのフォローを解除する行為に焦点を当てます(フォローする行為はほとんど類似しているため)。destroyRelationshipsController

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変数..これはa)現在ページを表示しているアクションで定義されているか、 b)アクションで定義されていますか?ヘルパーはすでに破壊されるものを見つけているようですが、なぜアクションはコントローラーで破壊されるためにもう一度全体を見つける必要があるのですか?unfollowshow destroyform_for@userdestroy@user
  2. このdestroyメソッドでは、@user最初にリレーションシップIDを見つけることによってが見つかります。そもそもリレーションシップIDがURIに渡される方法がわかりません(フォローを解除する特定のユーザーが表示されるため) 。破壊する/users/2ものを見つけるためにどのように使用されるかはわかりません。@user各Relationshipテーブルにはid、followed_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はのIDですRelationship。`method :: deleteを指定すると、destroyアクションが呼び出されます。

URL "/ users / 2"は、破棄アクションが実行された後、削除が実行された後のものだと思います。破棄アクションにリダイレクトがある可能性があります。(例redirect_to current_user)。呼び出されたすべてのアクションをログファイルで確認できます。ログをスクロールして、が見つかるかどうかを確認してくださいRelationshipsController#destroy。呼び出されたURLがそこに表示されます。また、HTMLを調べて、<form>タグの「アクション」属性が指している場所を確認することもできます。

于 2012-12-31T01:57:39.747 に答える