2

Ruby on Rails 3 チュートリアルを終了しました。最終章は非常に複雑です。本全体のチュートリアルは基本的に、ユーザーがマイクロポストを投稿できるサイトを作成します。また、各ユーザーは他のユーザーをフォローでき、次のユーザーのマイクロポストが元のユーザーのマイクロポスト フィードに表示されます。

私の質問は、RelationshipsController 内の create アクションの params 変数に 2 次元配列が含まれている理由に関するものです。

これがコードです。

ユーザー

class User < ActiveRecord::Base
  attr_accessible :email, :name, :password, :password_confirmation
  has_secure_password
  has_many :microposts, dependent: :destroy
  has_many :relationships, foreign_key: "follower_id", dependent: :destroy
  has_many :followed_users, through: :relationships, source: :followed
  has_many :reverse_relationships, foreign_key: "followed_id", 
      class_name: "Relationship", dependent:   :destroy
  has_many :followers, through: :reverse_relationships, source: :follower
end

マイクロポスト

class Micropost < ActiveRecord::Base
  attr_accessible :content
  belongs_to :user
end

関係

class Relationship < ActiveRecord::Base
  attr_accessible :followed_id

  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"
end

これは、2 次元の params 変数を作成するコードだと思います (しかし、なぜでしょうか?)

<%= form_for(current_user.relationships.build(followed_id: @user.id), remote: true) do       
    |f| %>
  <div><%= f.hidden_field :followed_id %></div>
  <%= f.submit "Follow", class: "btn btn-large btn-primary" %>
<% end %>

リレーションシップコントローラー

class RelationshipsController < ApplicationController  
  def create
    @user = User.find(params[:relationship][:followed_id])
    current_user.follow!(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end
end

自分の質問に答えただけかもしれませんが、params 変数の 2 次元配列は見たことがありません。誰かがこれに光を当てることができますか?

ああ、多分私もroutes.rbファイルを投稿する必要があります:

SampleApp::Application.routes.draw do
  resources :users do
    member do
      get :following, :followers
    end
  end
  resources :sessions, only: [:new, :create, :destroy]
  resources :microposts, only: [:create, :destroy]
  resources :relationships, only: [:create, :destroy]

  root to: 'static_pages#home'
end

ありがとう、マイク

4

1 に答える 1

4

簡潔な答え:

これは 2 次元配列ではなく、ネストされた連想配列です。それを使用する理由は、実際に必要なフィールドに到達するためです。


ロングアワー:

チュートリアルからの仮定: ユーザーがフォロー ボタンをクリックすると、目標は を呼び出すことcurrent_user.follow!(other_user)です。コードがこれをどのように達成しているかを説明します。すべての魔法は Relationship Controller とビューの form_for 関数にあります。

まず、新しい関係のフォームを作成します。これはネストされたリソースであるため、関連付けを通じて構築します。

current_user.relationships.build

しかし、1 人のユーザーにのみ対応するまったく新しい Relationship オブジェクトは、あまり意味がありません。代わりに、値の連想配列を渡してオブジェクトを初期化します。この場合、他のユーザーの ID。したがって、構築している Relationship オブジェクトの :followed_id 属性を @user.id、またはフォローしようとしているユーザーに割り当てます。

current_user.relationships.build(followed_id: @user.id)

オブジェクトに対して form_for を実行すると、オブジェクトの属性にアクセスできます。この場合、Relationship モデルを見ると、:followed_id のみがアクセス可能です。

class Relationship < ActiveRecord::Base
  attr_accessible :followed_id

current_user.follow!(other_user)最後に、フォームの目的はフォロー ボタンがクリックされたときに呼び出せるようにすることであるため、フォーム送信で followed_id を取得する必要があります。そのため、コントローラーでアクセスできるように followed_id を隠しフィールドとして渡しますparamsが、ユーザーはビュー自体でそれを見ることもありません。

  <%= f.hidden_field :followed_id %>

最後に、ボタンがクリックされると、フォームは新しい Relationship オブジェクト用であるため、Relationship コントローラーに対して create アクションが呼び出されます。そこで、フォームに対応する関係オブジェクトにアクセスするには、チュートリアルの他のフォームと同じ方法で行います -

params[:relationship]

しかし、関係オブジェクトは必要ありません。1 つのユーザー オブジェクトをフォローして、 を呼び出すことができますfollow!。かんたんだよ。IDからデータベース内のユーザーを見つけるだけです。followed_id を取得するには? フォームからの Relationship オブジェクトの属性です。

params[:relationship][:followed_id]

新しいユーザー オブジェクトを作成するときは、params[:user] を使用することに注意してください。これは単なる連想配列であり、必要に応じてそのフィールドにアクセスできます

params[:user][:name]

うまくいけば、それは理にかなっています。これは入れ子になった連想配列で、Rails がフォームの送信などのパラメーターを追跡するために使用します。

于 2012-07-16T17:36:57.787 に答える