0

私はRailsに頭を悩ませようとしていますが、何かが機能し、他の機能が機能しない理由を理解するのに苦労しています

たとえば、2 つのテーブルがあるとします。

クラス ユーザー

table users
email:string
password:string

クラスプロフィール

table profiles
firstname:string
lastname:string
city:string
user_id:integer

これで、各ユーザーには 1 つのプロファイルが必要です。

だから私が持っているモジュールuser.rbで

has_one :profile

そして profile.rb で

belongs_to :user

今私がしたいのは、テーブルに両方のテーブルを表示することだけです

<table>
 <tr>
  <th>User_ID</th>
  <th>Email</th>
  <th>Password digest</th>
  <th>First Name</th>
  <th>Last Name</th>
  <th>City</th>
 </tr>

<% @users.each do |user| %>
 <tr>
  <td><%= user.id %></td>
  <td><%= user.email %></td>
  <td><%= user.password %></td>
  <td><%= user.profile.firstname %></td>%></td>
  <td><%= user.profile.lastname %></td>%></td>
  <td><%= user.profile.city %></td>%></td>
 </tr>
<% end %>
</table>

インデックスページのあるコントローラーショーがあります

def index
 #this works
 @users = User.all(:include => :profile)
end

私が見つけたこのコードのスニペットは機能し、テーブルを適切に表示します。

しかし、これを機能させようとして収集/石畳にした他のコードのリストがありますが、それらは機能しません。

したがって、このコードのリストは、def インデックス内にあり、2 つのテーブルを接続するために個別に試行されます。

  1. @users = @users.build_profile() エラーをスローします: nil:NilClass の未定義メソッド `build_profile'

  2. @users = @users.profile スローされるエラー: nil:NilClass の未定義メソッド `profile'

  3. @users = @user.collect { |ユーザー| エラーがスローされます: nil:NilClass の未定義メソッド「collect」

  4. @users = Profile.find(:all) エラーをスローします: #Profile:0x46da5a0 の未定義のメソッド `email'

    <% @users.each do |user| %>
    <tr>
    <td><%= user.id %></td>
    <td><%= user.email %></td>
    <td><%= user.password %></td>
    <td><%= user.proflie.firstname %></td>
    
  5. @users = @profile.create_user() エラーをスローします: nil:NilClass の未定義メソッド `create_user'

  6. @users = @users.profiles エラーをスローします: nil:NilClass の未定義のメソッド `profiles'

  7. @users = @user.each { |ユーザー| エラーをスローします: nil:NilClass の未定義メソッド「each」

これらの他のすべてが失敗するのはなぜですか。同様の問題を抱えている他のユーザーでも機能するように見えました (2 つのテーブルを 1 対 0 の関係で接続する)。

4

1 に答える 1

0

発生している問題の大部分は、 でメソッドを呼び出しているという事実だけが原因ですnil@usersコレクションのメソッドを呼び出す前に、コレクションを初期化する必要があります。また、データベースに実際に何人かのユーザーが存在することを確認してください。

すべてのユーザーを取得する:

@users = User.all(:include => :profile)
@users = User.includes(:profile) # I prefer this syntax

プロフィールの作成。メソッドUserによって指定されたコレクションではなく、特定の でこれを呼び出す必要があることに注意してください。all

@profile = @users.first.build_profile # This won't actually save the profile

最初のユーザーのプロファイルを取得する

@profile = @users.first.profile

すべてのプロファイルの取得:

@profiles = @users.collect { |user| user.profile }

最初のユーザーのメールを取得する:

@email = @users.first.profile.email

残りは、上記のわずかに変更されたバージョンです。

于 2012-12-30T16:12:52.887 に答える