#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. на самом деле я еще не знаю о транзакциях. спасибо, что представили такое полезное руководство по транзакциям.