在Rails中渲染两个JSON项目

时间:2019-04-21 18:01:40

标签: ruby-on-rails json reactjs

这似乎是一个重复的问题,但其他帖子的答案似乎不适用于我在这里遇到的问题。

我需要在控制器的index方法内在此处呈现两个JSON项:

 def index
    @user = User.all
    @libraries = Library.all.order(:created_at)

    user_cards = current_user.libraries

    render :json => @libraries, :include => :user
    render :json => user_cards
  end

我尝试过这种方式(失败,出现500错误):

render :json => @libraries, user_cards, :include => :user

我也尝试过这种方式(也失败了,并显示500错误):render :json => @libraries :include => [:user, :user_cards]

更新

这是正确渲染json的最新尝试:

def index
    @user = User.all
    @libraries = Library.all.order(:created_at)

    user_cards = current_user.libraries

    render json: {
      user_cards: user_cards,
      libraries: @libraries.as_json(include: [:user])
    }
  end

问题是,我现在在整个应用程序中都遇到libraries上的错误。如果我只是像原始使用(render :json => @libraries, :include => :user一样呈现json,就不会出现此错误。因此,我假设我的方式仍然不正确。在libraries上的确切错误是在我使用过滤器的React组件之一中调用的:

错误:Uncaught TypeError: this.props.librarys.filter is not a function

错误位置:

let filteredCards = this.props.librarys.filter(
        (library) => {
          return library.title.toLowerCase().indexOf(this.state.search.toLowerCase()) !== -1 || library.desc.toLowerCase().indexOf(this.state.search.toLowerCase()) !== -1
        }
      )

1 个答案:

答案 0 :(得分:1)

控制器只能返回一个响应,您可以通过将这两个返回值合并为一个来实现:

respond_to do |format|
  format.json  { render json: { user_cards: user_cards,
                                libraries: @libraries } }
end