Rails — Как принять массив объектов JSON

#ruby-on-rails #json

#ruby-on-rails #json

Вопрос:

Как мне принять массив объектов JSON на моем сайте rails? Я публикую что-то вроде

 {'team':{'name':'Titans'}}
  

Однако, если я попытаюсь опубликовать JSON с массивом объектов. Он сохраняет только 1-й объект.

 {'team':[{'name':'Titans'},{'name':'Dragons'},{'name':'Falcons'}]}
  

Моя цель — отправить несколько «команд» в 1 файле JSON. Что я должен написать на стороне Rails?

На стороне rails у меня есть что-то вроде

 def create
  @team = Team.new(params[:team])
  @team.user_id = current_user.id

  respond_to do |format|
    if @team.save
      format.html { redirect_to(@team, :notice => 'Team was successfully created.') }
      format.json  { render :json => @team, :status => :created, :location => @team }
    else
      format.html { render :action => "new" }
      format.json  { render :json => @team.errors, :status => :unprocessable_entity }
    end
  end
end
  

Должен ли я использовать параметры: и для каждого элемента создавать новую команду или что-то в этом роде? Я новичок в ruby, поэтому буду признателен за любую помощь.

Ответ №1:

Позвольте мне предположить, что вы публикуете

 {'team':[{'name':'Titans'},{'name':'Dragons'},{'name':'Falcons'}]}
  

Тогда ваши параметры будут

 "team" => {"0"=>{"chapter_name"=>"Titans"}, "1"=>{"chapter_name"=>"Dragons"}, "2"=>{"chapter_name"=>"Falcons"}}  
  

Моя идея такова

 def create
  #insert user id in all team
  params[:team].each_value { |team_attributes| team_attributes.store("user_id",current_user.id) }
  #create instance for all team
  teams = params[:team].collect {|key,team_attributes| Team.new(team_attributes) }
  all_team_valid = true
  teams.each_with_index do |team,index|
    unless team.valid?
      all_team_valid = false
      invalid_team = teams[index]
    end 
  end 

  if all_team_valid
    @teams = []
    teams.each do |team|
      team.save
      @teams << team
    end 
    format.html { redirect_to(@teams, :notice => 'Teams was successfully created.') }
    format.json  { render :json => @teams, :status => :created, :location => @teams }
  else
    format.html { render :action => "new" }
    format.json  { render :json => invalid_team.errors, :status => :unprocessable_entity }
  end 

end 
  

Комментарии:

1. Если вы хотите сохранить все команды или ни одну, вы должны обернуть сохранения внутри транзакции (конечно, при условии, что ваша БД поддерживает транзакции) api.rubyonrails.org/classes/ActiveRecord/Transactions /…

2. на самом деле я еще не знаю о транзакциях. спасибо, что представили такое полезное руководство по транзакциям.