Rails - 如何通过form_for中的关联显示值?

时间:2012-04-06 18:19:43

标签: ruby-on-rails-3 model associations form-for

这是我的观点:

= 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

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

1 个答案:

答案 0 :(得分:2)

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

  1. city_namecity_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. 或者您可以将其视为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