我正试图绕过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索引中以连接两个表
@users = @ users.build_profile() 引发错误:nil的未定义方法`build_profile':NilClass
@users = @ users.profile 引发错误:nil的未定义方法`profile':NilClass
@users = @ user.collect {| user |用户资料 } 引发错误:未定义的方法`collect'代表nil:NilClass
@users = Profile.find(:all) 引发错误:#Profile的未定义方法`email':0x46da5a0
<% @users.each do |user| %>
<tr>
<td><%= user.id %></td>
<td><%= user.email %></td>
<td><%= user.password %></td>
<td><%= user.proflie.firstname %></td>
@users = @ profile.create_user() 引发错误:nil的未定义方法`create_user':NilClass
@users = @ users.profiles 引发错误:nil的未定义方法`profiles':NilClass
@users = @ user.each {| user | user.profiles} 引发错误:nil的未定义方法“each”:NilClass
为什么所有这些其他的都失败了,它们似乎适用于有类似问题的其他用户(连接两个关系为1到0的表)
答案 0 :(得分: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
其余部分仅是上述版本的略微修改版本。