For the impatience, all the code is here.
Background: I have more than 2500 customers in the app that I'm developing, so I want the ajax-auto-complete functionality in the field "customer name" when I want to create a new appointment, this way the final user can find the user easily. I coded the next React component:
// file: app/assets/javascripts/components/appointment_form.jsx var MyList = React.createClass({ getInitialState: function() { return { childSelectValue: undefined, getOptions: [], url: '/appointments/get_data', // add to your routes.rb options: [] } }, changeHandler: function(e) { console.log('In changeHandler method'); var tmp = this.getData(e); this.forceUpdate(); }, getData: function(e) { e.preventDefault(); ovalue = e.target.value // first character typed for the user console.log(ovalue); link = {url: this.state.url, ovalue: ovalue}; $.ajax({ type: 'POST', data: link, url: this.state.url, headers: {'X-CSRFToken': Cookies.get('csrf-token')}, // rails asks for this cache: false, dataType: 'json', success: function(data) { if (data != undefined) { console.log( ">>>>>> Line 108 data >>>>>>>"+JSON.stringify(data)); this.setOptions(data); } }.bind(this), error: function(xhr, status, err) { console.error(this.state.url, status, err.toString()); }.bind(this) }); }, setOptions: function(data) { var tempo = []; for (var i = 0; i < data.length; i++) { var option = data[i]; var tmp = ; tempo.push(tmp); // add the option } console.log( ">>>>>> Line 127 data >>>>>>>"+JSON.stringify(tempo)); this.setState({options: tempo}); }, render: function() { return ( <span> <input type="text" className="form-control" onChange={this.changeHandler} placeholder="Owner" list="slist" name="owner" /> <datalist id="slist">{this.state.options}</datalist> </span> ) } });
Now include your MyList component inside the form tag:
// file: app/assets/javascripts/components/appointment_form.jsx (continuation) render: function() { return React.DOM.form({ className: 'form-inline', onSubmit: this.handleSubmit },, React.DOM.button({ type: 'submit', className: 'button-primary', }, 'Create appointment')); });
In Appointments controller:
# POST /appointments/get_data def get_data owner = params[:ovalue] # ovalue cames from react results = User.where("lname ~ '#{owner}' AND group_id=2").select(:id, :fname, :lname) logger.debug "### get_data in appointments #####################>>>> #{params.to_json} " users = results.map do |r| {value: r.id, name: "#{r.lname} #{r.fname}" } end return render json: users.to_json # send this back to react end
Results: