0

这是我的看法:

= 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

错误消息(伦敦)中显示的结果是正确的,但为什么我会收到该错误消息?

4

1 回答 1

2

to 的参数f.autocomplete_field应该是方法的名称。表单生成器将发送此方法以@user获取正确的值。由于您感兴趣的值不在用户中,而是在用户拥有的对象中,因此您有几个选择:

  1. 向您的 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
    
  2. 或者您可以将其视为嵌套对象。将此添加到用户:

    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
    
于 2012-04-06T19:17:21.070 回答