0
votes

I am trying to use auto-complete/type-ahead feature provided by following Rails gem https://github.com/maxivak/bootstrap3_autocomplete_input , together with https://github.com/plataformatec/simple_form

Everything works fine in case I choose "new" action for new record in form. I am able to choose value in input field by auto-complete feature. Problem is in case i choose "edit" action to edit already existing record. In that case field does not show correct value (pre-filled by form), but it shows something like: #<Airport:0x007f98b478b7a8>

Even in "show" action, I can see correct value displayed.

I tried to change f.input with f.association as I had it before I started implementing auto-complete, but this did not helped.

Records in Cargo model have correct airports_id reference stored, I checked that manually in rails console.

Question is how can I get correct Airport value pre-filled by form in case I choose "edit" action, instead some kind of reference, I got.

Rails 4.1.7

My code is:

Cargo model:

class Cargo < ActiveRecord::Base
  belongs_to :airport
...

Cargo view:

...
<%= f.input :airport, :as => :autocomplete, :source_query => autocomplete_airport_city_airports_url %>
...

Airport model:

class Airport < ActiveRecord::Base
  has_many :cargos, :dependent => :destroy
  attr_accessible :iata_code, :name, :city
  validates :iata_code, :name, :city, presence: true
  validates :iata_code, :uniqueness => { :scope => :name }
  validates :iata_code, length: { is: 3 }, format: { with: /\A[a-zA-Z\d\s]*\z/ }
  validates :name, :city, length: { minimum: 2, maximum: 128 }

  def full_airport_name
    "#{city} / #{iata_code}"
  end
end

Airports controller

class AirportsController < ApplicationController
  autocomplete :airport, :city, { :display_value => 'full_airport_name', :full_model=>true }
...

Routes:

resources :airports do
  get :autocomplete_airport_city, :on => :collection
end
2

2 Answers

2
votes

Actually I found the problem. First of all I refactored Airports model, removed all columns but name, and reseed name column with data concatenated from separate strings IATA code / City. After this, there is need to specify in model, what to show as value. Simply this solved this issue:

class Airport < ActiveRecord::Base
  has_many :cargos, :dependent => :destroy
  attr_accessible :name
  validates :name, presence: true
  validates :name, :uniqueness => true

  def to_s
    name
  end
end

This is described, I didnot understand it on first sight previously, in original documentation here https://github.com/maxivak/bootstrap3_autocomplete_input section Model.

0
votes

User f.association and because rails will automatically look for :nameand you do not have that, you'll have to define it like so:

f.association :airport, label_method: :full_airport_name, value_method: :id........etc