如何使用curl更新数组值

时间:2014-03-11 13:26:46

标签: ruby-on-rails curl

How to post array values via curl中,它给出了如何通过curl设置数组值的一个很好的例子:

$ curl -X POST http://localhost:3000/api/v1/shops.json -d \
  "shop[name]=Supermarket \
  &shop[products][]=fruit \
  &shop[products][]=eggs \
  &auth_token=a1b2c3d4"

我想知道的是,是否有办法通过curl更新现有阵列而不覆盖值?

关于我正在尝试做什么的更多信息 - 我正在尝试创建一个在用户/调查之间具有HABTM关系的rails调查应用程序。在用户进行调查后(在我的Android应用中),它应该使用用户/调查更新联接表,以便再次向用户提供相同的调查。我一直试图通过卷曲复制这个但是遇到了一些麻烦。

我可以通过curl中的PUT请求更新调查标题:

curl -v -H 'Content-Type: application/json' -H 'Accept: application/json' -X PUT -d '{"title":"123dddTestingPlease rddfsfsfrdf","id":3,"users":[{"id":2,"email":"test@testme.com","created_at":"2014-02-28T01:56:09.841Z","updated_at":"2014-02-28T01:56:09.879Z","admin":true,"auth_token":"7acac413cbc22049a3ebf074f45c9847"}]}' http://localhost:3000/surveys/1

但是我在更新用户数组时遇到了麻烦。理想情况下,它只会附加我发送给现有用户数组的用户。

提前致谢!

修改 首先回答你的问题 - 问题是当我执行curl请求时,用户数组似乎根本没有更新。我的最终目标是当用户在Android应用程序上完成调查时,我想向rails服务器发送PUT消息,该服务器将更新该调查以包含该用户(当应用程序检查调查是否是可用,它检查用户是否参加了调查)。

这是我的调查控制器(为了便于阅读,我删除了除Update之外的所有内容):

class SurveysController < ApplicationController
  before_action :set_survey, only: [:show, :edit, :update, :destroy]

  # PATCH/PUT /surveys/1
  # PATCH/PUT /surveys/1.json
  def update
    respond_to do |format|
      if @survey.update(survey_params)
        format.html { redirect_to @survey, notice: 'Survey was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @survey.errors, status: :unprocessable_entity }
      end
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_survey
      @survey = Survey.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def survey_params
      params.require(:survey).permit(:title, :users)
    end
end

我还尝试了一个变体,我只是发送用户的auth_token,然后我通过它来识别用户并尝试将它们添加到用户列表中,但这似乎也不起作用。这是代码的样子:

def update
    @survey = Survey.find(params[:id])
    @survey.add_user params[:auth_token]
    redirect_to api_v1_survey_path(@survey)
 end

模特:

class Survey < ActiveRecord::Base
  has_many :surveytizations
  has_many :questions, :through => :surveytizations
  has_many :users, :through => :completions
  has_many :completions

  def complete_survey (survey, user)
    survey.users << user
    survey.number_taken += 1
    if survey.number_taken == survey.survey_limit
      survey.survey_finished = true
    end
  end

  def add_user auth_token
    user = User.find_user_by_token auth_token
    completions.create(user_id: user.id)
  end

  def find_user(auth_token)
    user = User.find_user_by_token auth_token
    if (user != nil && completions.find_by(user_id: user.id) != nil) 
      return true
    else
      return false
    end
  end

  def self.check_survey (auth_token)
    Survey.all.each do |survey|
      next if survey.survey_finished
      next if survey.find_user auth_token
      return survey.id
    end
  end
end

1 个答案:

答案 0 :(得分:1)

我最终搞清楚了。这是我将控制器更改为:

 def update 
        @survey = Survey.find(params[:id])
        @user = User.find_user_by_token params[:auth_token]
        @survey.users << @user
        redirect_to api_v1_survey_path(@survey)
      end