Совершенно новый для приложений React on Rails, особенно для части React. Я пытаюсь получить доступ к данным во вложенном хэше, полученном из SQL-запроса в службе Rails. Во-первых, это вообще возможно?
В Rails Console допустим, что user1 уже найден по id, LedgersService.transactions(user1).first возвращает все данные в этом формате:
{:transactable=>{:type=>"Deposit", :id=>"28cba04f-5b9d-4c9c-afca-b09a6e0e8739", :user_id=>"72700244-e6b0-4baf-a381-c22bfe56b022", :transacted_at=>"2019-03-12 19:04:48.715678", :amount_cents=>15, :notes=>"none", :processor=>nil, :details=>nil}, :ledgers=>[{:entry_type=>"credit", :amount_cents=>15, :transacted_at=>"2019-03-12 19:04:48.715678", :user_id=>"72700244-e6b0-4baf-a381-c22bfe56b022", :transactable_type=>"Deposit", :transactable_id=>"28cba04f-5b9d-4c9c-afca-b09a6e0e8739"}]}
Я пытаюсь сделать что-то подобное в своем компоненте React, чтобы попытаться получить данные, однако я не совсем уверен, как установить часть LedgersService.transactions. Вот как это у меня сейчас:
class LedgersIndex extends React.Component {
constructor(props) {
super(props);
this.state = { ledgers_service: { transactions: [] }, paginator: { count: 0, page: 0, limit: 0 }, user: { id: this.props.match.params.user_id } };
Мой вызов конечной точки:
componentDidMount() {
var user_id = this.state.user.id;
this.fetchData(user_id, 1);
}
fetchData = (user_id, page_number) => {
apiService.ledgersIndex(user_id, page_number)
.then(
paginated => {
this.setState({
ledgers_service: {
transactions: paginated.ledgers_service.transactions
},
paginator: {
limit: paginated.meta.limit,
count: paginated.meta.count,
page: paginated.meta.page -1
}
});
},
Далее в моем рендере:
render() {
const { classes } = this.props;
const { ledgers_service, paginator } = this.state;
Моя выборка в apiService:
function locationsIndex(page_number) {
const requestOptions = {
method: 'GET',
headers: Object.assign({},
authorizationHeader(),
{ 'Content-Type': 'application/json' })
};
return fetch(`${process.env.API_SERVER}/api/v1/admin/locations?page=${page_number}`, requestOptions)
.then(handleResponse)
.then(paginated => {
return paginated;
});
}
Когда я console.info(ledgers_service.transactions(this.state.user.id)), я получаю сообщение об ошибке, что Ledgers_Service.transactions не является функцией. Однако console.info(paginator.count) работал, это потому, что транзакции устанавливаются в массив?
Как правильно получить ту же конечную точку в моем компоненте React, что и в моей консоли rails?





Quite new to React on Rails apps, especially the React portion. I'm trying to access data in a nested hash that is given from a SQL query in a Rails service.
Да, JS любит JSON, поэтому у вас должно быть действие Rails, которое отвечает JSON. Это правильный способ обмена данными между React и Rails:
# in your React app
fetch('/path/to/resource.json')
.then((returnedResource) => {
// do something with JSON
})
.catch(error => console.error('Error:', error));
# in your controller
respond_to do |format|
format.json { render json: LedgersService.transactions(user1).first }
end
Оттуда вы можете рассматривать свой returnedResource как объект JSON. В вашем случае это будет pagination
Я обновил свою выборку в своем исходном вопросе внизу. И главное, что я хочу вернуть, это не данные из LedgersService, как именно они доступны в React? Я попробовал то, что включено выше, установив Ledgers_Service: [], в this.state, затем я также попробовал только транзакции: [] в состоянии, все возвращаются пустыми
Я не понимаю ваш последний вопрос. Не пытайтесь вместить слишком много кода в эти комментарии, потому что их трудно читать. Отредактируйте свой пост, добавив более важные детали. Если вы хотите показать что-то один на один, есть сотни способов сделать это, и я не могу перечислить их все. Если вы можете получить свои данные из Rails в формате JSON, то этот поток мертв, и я успешно ответил на ваш первоначальный вопрос. Если вам нужна дополнительная помощь, переместите этот разговор в чат со мной или в такое место, как reddit.com/r/learnprogramming/новый. Я поищу твой пост.
Вот как в настоящее время работает контроллер в моем классе User: ** def transaction t = LedgersService.transactions(@user) json_response(t) end ** Будет ли первый в конце по-прежнему отображать все ответы 1 на 1?