这是我的观点:
= form_for(@user) do |f|
= f.autocomplete_field @user.city.name, autocomplete_city_name_users_path
在第二行,我试图显示关联,但我正在
undefined method `London' for #<User:0x00000129bb3030>
协会:
用户 belongs_to :city
城市 has_one :user
错误消息(伦敦)中显示的结果是正确的,但为什么我会收到该错误消息?
答案 0 :(得分:2)
f.autocomplete_field
的参数应该是方法的名称。表单构建器将此方法发送到@user
以获取正确的值。由于您感兴趣的值不在用户中,而是在用户拥有的对象中,因此您有以下几种选择:
将city_name
和city_name=
方法添加到您的用户类:
# app/models/user.rb
def city_name
city && city.name
end
def city_name=(name)
city.name = name # You'll want to make sure the user has a city first
end
如果您不知道如何确保拥有城市,可以通过将city_name=
方法更改为此来懒惰地创建一个城市:
def city_name=(name)
build_city unless city
city.name = name
end
然后你的表格看起来像这样:
= form_for(@user) do |f|
= f.autocomplete_field :city_name, autocomplete_city_name_users_path
或者您可以将其视为nested object。将其添加到用户:
accepts_nested_attributes_for :city
在表单中使用fields_for
:
= form_for(@user) do |f|
= f.fields_for :city do |city_f|
= city_f.autocomplete_field :name, autocomplete_city_name_users_path