Rails + React nie wyświetla danych w tabeli

Cześć. Przerabiam właśnie poradnik “React On Rails” ze strony https://www.nopio.com/blog/react-rails-part-1-tutorial/
Jestem przy punkcie 16, robię dokładnie to co jest podane na stronie a mimo to nie pokazuje mi danych w tabeli (wchodząc na /api/events pokazuje wszystkie dane poprawnie)
Poradnik został napisany ok rok temu więc może pewne rzeczy są nieaktualne ale nie mam pojęcia gdzie jest błąd. Chodzi dokładnie o <tbody>{events}</tbody> w pliku event_table.js.jsx

root 'dashboard#index'
namespace :api do
  resources :events
end

events_controller.rb:

module Api
  class EventsController < ApplicationController
    def index
      render json: Event.all
    end
  end
end

dashboard/index.html.erb:

<%= react_component 'EventApplication' %>

event_application.js.jsx:

var EventApplication = React.createClass({
  getInitialState: function() {
    return { events: [] };
  },
  componentDidMount: function() {
    this.getDataFromApi();
  },
  getDataFromApi: function() {
    var self = this;
    $.ajax({
      url: '/api/events',
      success: function(data) {
        self.setState({ events: data });
      },
      error: function(xhr, status, error) {
        alert('Cannot get data from API: ', error);
      }
    });
  },
  render: function() {
    return(
      <div className="container">
        <div className="jumbotron">
          <h1>ReactJS</h1>
          <p>tutorial</p>
        </div>
        <div className="row">
          <div className="col-md-12">
            <EventTable events={this.state.events} />
          </div>
        </div>
      </div>
    )
  }
});

event_table.js.jsx:

var EventTable = React.createClass({
  render: function() {
    var events = [];
    this.props.events.forEach(function(event) {
      events.push(<Event event={event}
                         key={'event' + event.id}/>);
    }.bind(this));
    return(
      <table className="table table-striped">
        <thead>
          <tr>
            <th className="col-md-3">Name</th>
            <th className="col-md-2">Date</th>
            <th className="col-md-3">Place</th>
            <th className="col-md-4">Description</th>
          </tr>
        </thead>
        <tbody>
          {events}
        </tbody>
      </table>
    )
  }
});

event.js.jsx:

var Event = React.createClass({
  propTypes: {
    name: React.PropTypes.string,
    event_date: React.PropTypes.string,
    place: React.PropTypes.string,
    description: React.PropTypes.string
  },
  render: function() {
    var event = this.props.event;
    return(
      <tr>
        <td>{event.name}</td>
        <td>{event.event_date}</td>
        <td>{event.place}</td>
        <td>{event.description}</td>
      </tr>
    )
  }
});

Konsola coś rzuca?

żadnych błędów, jedynie:

Started GET "/" for 127.0.0.1 at 2017-11-22 17:34:23 +0100
Processing by DashboardController#index as HTML
  Rendering dashboard/index.html.erb within layouts/application
  Rendered dashboard/index.html.erb within layouts/application (1.1ms)
Completed 200 OK in 177ms (Views: 174.3ms | ActiveRecord: 0.0ms)

Konsola JS w przeglądarce, masz zainstalowną wtyczkę do reacta?
React Extension
Dodaj to sobie

2 Likes

Dzięki, zainstalowałem i zobaczyłem błąd “$ is not defined”, poszukałem trochę i wyczytałem że odnosi się to do jquery, więc dodałem gem jquery-rails i teraz wszystko działa.

1 Like

Cześć @Wictigo - jestem autorem tego tutoriala, więc może rozjaśnię.
Tak jak napisałeś - nie miałeś dodanego jQuery. Specjalnie do każdego tutoriala dodaję cały kod źródłowy, tak, aby każdy mógł sprawdzić co ma inaczej, czy jego wersje gemów są inne czy też kod.

Tutaj jest Gemfile: https://github.com/nopio/react_example/blob/master/Gemfile

Jeśli dobrze pamiętam, jQuery w tym tutorialu było potrzebne do pobierania danych z serwera Ajaxem.

Pozdro,
Piotrek