You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Redux Reducer中区分Rails后端单个API Action返回的不同实例变量

如何在Redux Reducer中区分来自单个Rails Action的多个实例变量

这问题我之前处理过类似场景,其实核心是确保Rails返回结构化的JSON,然后在Redux侧通过对象键来拆分对应数据,具体步骤如下:

1. 先确认Rails端的JSON输出结构

因为你用了json.builder处理输出,一定要保证最终返回的是一个顶层对象,把所有需要的实例变量作为键值对包含进去。比如你的setup_possible_matches.json.builder应该这样写:

# app/views/possible_matches/setup_possible_matches.json.builder
json.contemplated_piece @contemplated_piece
json.standalone_tops @standalone_tops
# 其他需要返回的GorClothing相关实例变量同理添加

这样前端拿到的响应会是一个完整的对象,格式大概是:

{
  "contemplated_piece": { ... },
  "standalone_tops": [ ... ],
  // 其他实例变量数据
}

2. Redux Action中完整传递响应数据

当你的Redux Action调用这个API接口后,要把整个响应对象作为payload传递给Reducer。举个用axios的例子:

// src/actions/possibleMatchesActions.js
export const fetchPossibleMatches = () => async (dispatch) => {
  dispatch({ type: 'FETCH_POSSIBLE_MATCHES_REQUEST' });
  try {
    const response = await axios.get('/possible_matches/setup_possible_matches');
    // 把整个响应数据作为payload传给Reducer
    dispatch({
      type: 'FETCH_POSSIBLE_MATCHES_SUCCESS',
      payload: response.data
    });
  } catch (err) {
    dispatch({
      type: 'FETCH_POSSIBLE_MATCHES_FAILURE',
      payload: err.message
    });
  }
};

3. Reducer中拆分并更新对应State字段

首先定义初始State,对应每个Rails实例变量设置对应的字段(建议用JS驼峰命名,和Rails的蛇形命名区分开):

// src/reducers/possibleMatchesReducer.js
const initialState = {
  contemplatedPiece: null,
  standaloneTops: [],
  // 对应其他实例变量的State字段
  isLoading: false,
  error: null
};

然后在处理成功的Action时,直接解构payload里的各个键,分别更新对应的State字段:

const possibleMatchesReducer = (state = initialState, action) => {
  switch (action.type) {
    case 'FETCH_POSSIBLE_MATCHES_REQUEST':
      return {
        ...state,
        isLoading: true,
        error: null
      };
    case 'FETCH_POSSIBLE_MATCHES_SUCCESS':
      // 解构Rails返回的蛇形命名键,转换为驼峰命名赋值给State
      const { contemplated_piece, standalone_tops } = action.payload;
      return {
        ...state,
        contemplatedPiece: contemplated_piece,
        standaloneTops: standalone_tops,
        isLoading: false,
        error: null
      };
    case 'FETCH_POSSIBLE_MATCHES_FAILURE':
      return {
        ...state,
        isLoading: false,
        error: action.payload
      };
    default:
      return state;
  }
};

export default possibleMatchesReducer;

这样一来,你就能在Reducer里清晰区分来自单个Rails Action的不同实例变量,分别更新Redux State的对应部分,后续在组件里也可以通过useSelector轻松获取各个字段的数据。

内容的提问来源于stack exchange,提问作者flo527

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:30:23