0

これは私の見解です:

= form_for(@user) do |f|
  = f.autocomplete_field @user.city.name, autocomplete_city_name_users_path

2行目で関連付けを表示しようとしていますが、取得しています

undefined method `London' for #<User:0x00000129bb3030>

協会:

ユーザー belongs_to :city

has_one :user

エラー メッセージ (London) に表示された結果は正しいのに、なぜそのエラー メッセージが表示されるのですか?

4

1 に答える 1

2

への引数f.autocomplete_fieldは、メソッドの名前でなければなりません。フォーム ビルダーは、このメソッドを に送信し@userて、正しい値を取得します。関心のある値はユーザーではなく、ユーザーが所有するオブジェクトにあるため、いくつかのオプションがあります。

  1. city_nameおよびメソッドを User クラスに追加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 に答える