2

私は現在、このコードに苦労しています

@play = current_user.playlist.find_by_id(params[:id])

とはcurrent_user.playlist.find_by_id()どういう意味ですか? このコードをトレースして current_user、プレイリスト、および find_by_id() 関数を見つけるにはどうすればよいですか?

4

2 に答える 2

4

その場合は、現在ログインしているユーザーであるcurrent_userクラスのインスタンスを返します。Userまたはnil、ログインしているユーザーがいない場合。

playlistは class で定義されたメソッドUserです。このクラスは にありますapp/models/user.rb。通常、このメソッドは次のように定義されます。

has_one :playlist

また:

belongs_to :playlist

find_by_idは Rails によって class に対して定義されたメソッドであり、Userこれはファイルに直接表示されません。次のようなものがある場合に作成されます。

class User < ActiveRecord::Base

ActiveRecord::Baseより多くのメソッドを作成します。

コードをデバッグする

文の各部分を印刷します

p current_user
p current_user.playlist
p params[:id]
p current_user.playlist.find_by_id(params[:id])

私のサーバーコンソールで結果を確認すると、これらのうちどれが最初のものかを見つけることができますnil.

于 2013-07-10T05:14:36.740 に答える
1

Ruby ではすべてがオブジェクトであり、オブジェクトにはメソッドがあります。オブジェクトにも型があります。

トップレベルのオブジェクトはcurrent_user. これはあるクラスのインスタンスですcurrent_user.class。のインスタンスであることがわかると思いますUser

Userしたがって、 yourが定義されている場所を見つけます。これは、 で定義されたモデルである可能性がありapp/models/user.rbます。このモデルは、いくつかの属性と関連付けを指定します。この場合、has_many :playlists関連付けがある可能性があります。Userこれが行うことは、インスタンスと多数のインスタンスの間の関連付けを設定することPlaylistです。ユーザー インスタンスを指定すると、user_instance.playlistsこの関連付けにアクセスします。モデルPlaylistにはuser_id、プレイリストをユーザー レコードに関連付けるフィールドがあります。関連付けの詳細については、関連ドキュメントを参照してください。

最後に、この関連付けには、Rails の多数のメソッドが含まれます。find_by_idActiveRecord には、メソッド名に基づいて検索対象のフィールドを推測するなどの「魔法の」ファインダーと同様に、ファインダーの標準セットがあります。find_by_id(params[:id])のようなものと機能的に同等ですがfind_by(:id => params[:id])、もう少し英語っぽいです。これについては、ドキュメントの Dynamic Finders メソッドで詳しく読むことができます。

find_by_iduser_idは、一致するのID を持つ、その ID を持つプレイリスト レコードを見つけるために必要な SQL を生成しますcurrent_user。一致するレコードが見つかった場合、取得したデータを使用してプレイリスト レコードをインスタンス化し、それを返します。一致するレコードが見つからない場合は、nil を返します。

于 2013-07-10T05:30:51.020 に答える