Note that there are some explanatory texts on larger screens.

plurals
  1. POParse JSON HTTP post in Rails 3 app?
    text
    copied!<p>I have a simple Rails 3 example application that I'm trying to work out how to parse a JSON POST and insert the data into my applications database.</p> <p>I have a basic Activities controller and model, the controller is as follows:</p> <pre><code>class ActivitiesController &lt; ApplicationController # GET /activities # GET /activities.json def index @activities = Activity.order('created_at DESC').limit(10) respond_to do |format| format.html # index.html.erb format.json { render json: @activities } end end # GET /activities/1 # GET /activities/1.json def show @activity = Activity.find(params[:id]) respond_to do |format| format.html # show.html.erb format.json { render json: @activity } end end # GET /activities/new # GET /activities/new.json def new @activity = Activity.new respond_to do |format| format.html # new.html.erb format.json { render json: @activity } end end # GET /activities/1/edit def edit @activity = Activity.find(params[:id]) end # POST /activities # POST /activities.json def create @activity = Activity.new(params[:activity]) respond_to do |format| if @activity.save format.html { redirect_to @activity, notice: 'Activity was successfully created.' } format.json { render json: @activity, status: :created, location: @activity } else format.html { render action: "new" } format.json { render json: @activity.errors, status: :unprocessable_entity } end end end # PUT /activities/1 # PUT /activities/1.json def update @activity = Activity.find(params[:id]) respond_to do |format| if @activity.update_attributes(params[:activity]) format.html { redirect_to @activity, notice: 'Activity was successfully updated.' } format.json { head :no_content } else format.html { render action: "edit" } format.json { render json: @activity.errors, status: :unprocessable_entity } end end end # DELETE /activities/1 # DELETE /activities/1.json def destroy @activity = Activity.find(params[:id]) @activity.destroy respond_to do |format| format.html { redirect_to activities_url } format.json { head :no_content } end end end </code></pre> <p>I have also got an example JSON payload from the application I'm trying to receive the POST from:</p> <pre><code>payload {"files":{"changed":[],"removed":[".gitmodules","extensions","extensions/markdown"]},"project":{"permalink":"dans-stuff-2","public_key":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuB80S+kMN1266LvCEXoU5hmjugcuXko61Hl7uD9VVgMgEOrLSkeYktOPshgCOwjQgGhSMVEHWrSuOddOi+V3rOu3v91jiU3vycRM3nK9GMaOFf+tTn0/4ReUvGOFHeir1vluHCmOAmpqsVhGWkCJY6eJE37muvGdTG4nW/VnpWYCTLfSOeaq5MVx5LU+zYLntvB5PXd7h1k5ROO8lW+5QzGVyHHEvilzJOqESIAWpNtcXGBt7clWpFH4lg2AT7JebYFuHl8Sl4LYzIRegcpg718CWJjrck9/xV6CBTGP520ifU6K0x4JOn/qFzVlqwnxmrPXwawptmCiYiJt3X8Oz DeployHQ.com Key for dans-stuff-2","name":"Dans Stuff","repository":{"port":null,"username":null,"branch":"master","url":"git@codebasehq.com:atech/deploytest/test1.git","scm_type":"git","cached":true,"hosting_service":{"name":"Codebase","url":"http://www.codebasehq.com","commits_url":"http://atech.codebasehq.com/projects/deploytest/repositories/test1/commits/master","tree_url":"http://atech.codebasehq.com/projects/deploytest/repositories/test1/tree/master"}}},"server":{"name":"cybele","server_path":"/home/dan/deploytest","port":22,"username":"dan","use_ssh_keys":true,"last_revision":"2ad223b9dd6d006d69909407ac7df322e35b009b","hostname":"cybele.phoenixdev.co.uk","identifier":"de99437e-da4a-0986-a7ab-e55805261a96","protocol_type":"ssh"},"start_revision":{"timestamp":"2011-11-30T13:48:22+00:00","author":"Dan Wentworth","ref":"a1c1073b85d1662c075d77f5d88be3fd291abd12","message":"nested markdown pathg","email":"dan@atechmedia.com"},"identifier":"9d0f9c21-f242-3966-fcd3-e821a65acd45","end_revision":{"timestamp":"2011-08-30T16:41:32+01:00","author":"Dan Wentworth","ref":"2ad223b9dd6d006d69909407ac7df322e35b009b","message":"arses","email":"dan@atechmedia.com"},"configuration":{"email_notify":true,"notification_addresses":"dan@atechmedia.com","copy_config_files":true},"timestamps":{"completed_at":"2012-01-17T09:22:15Z","duration":null,"queued_at":"2012-01-17T09:22:07Z","started_at":"2012-01-17T09:22:10Z"},"status":"completed"} -------------------------------------------------------------------------------- signature TMjVYhk/+lQigy3hdkgTZjAaaroxAi126XaDzrQ1xWGyMji9oR0F5nfE73Mo kNs7Hk7aY1GQgtDRdBjgPE+C/6etF9nPFXPacWobaxSP35TGOrpoSACNQDAQ Q0wvn0Bm/jMvhBKoQ6YYUSx8KP8nd7VkgQmv4S0cakgixA4LHfg= </code></pre> <p>Because the POST will need to be made to a URL, I would imagine I need to define a new method:</p> <pre><code>def deploy_receive data = JSON.parse(request.body) end </code></pre> <p>What I am unsure of, is where to go from here. How would I cherry pick the attributes from the JSON and put them into various attributes in the Activities table?</p> <p>Something like this?</p> <pre><code>def deploy_receive data = JSON.parse(request.body) @activity = Activity.new(params[:fault]) @activity.who = data.author end </code></pre> <p>Any pointers would be appreciated!</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload