我使用的是Rails 4.2.4。我知道我已经正确设置了我的关系,但我得到了undefined method "city" for #
support.rb:
belongs_to :user
user.rb:
has_many :supports (should the be plural?)
视图/用户/ show.html.erb:
<%= @user.supports.city %>
在我的支持表中:
t.string :city
t.integer :user_id
我有一个支持表单,我填写了city
字段,我可以在rails控制台的Support.all
条目中看到,所以我确定:city
的值是保存在数据库中。
我已将rails g scaffold support
用于此过程,用户可以在此过程中创建许多支持。我错过了什么吗?
答案 0 :(得分:3)
has_many :supports
应为复数@user.supports
返回所有支持但它可以返回一个空数组。所以你必须使用: if support = @user.supports.first
# use support.city
end
或
<% @user.supports.each do |support| %>
<h1><%= support.city %></h1>
<% end %>
答案 1 :(得分:2)
如果您尝试访问关联数据,则需要了解多元关系(IE has_many
)将返回集合数据:
#app/models/support.rb
class Support < ActiveRecord::Base
belongs_to :user #-> @support.user
end
#app/models/user.rb
class User < ActiveRecord::Base
has_many :supports #-> @user.supports
end
要回答有关:plural
,否的问题,您无需将其称为复数形式。但是,根据Rails惯例,它构建了整个关系(和查询)off the back of the name:
belongs_to
个关联必须使用单数术语。如果你用过 以上例子中的客户关联的复数形式 订单模型,你会被告知有一个“未初始化的 常量订单::客户“。这是因为Rails自动推断 关联名称的类名。如果关联名称是 错误地多元化,那么推断的类将被错误地复数化 太
如果您想为has_many
的关联使用单数名称,则必须定义您的班级等:
#app/models/user.rb
class User < ActiveRecord::Base
has_many :support, class_name: "Support", foreign_key: "support_id"
end
-
当您从has_many
集合获取退回的数据时,您需要循环访问数据。由于它是一个集合(而不是“成员” - 单个记录),您将需要类似以下内容:
<% @user.supports.each do |support| %>
<%= support.city %>
<% end %>