Commit 635d0638c3b3fc841eaedcc7bd2dc8f604f3502b
1 parent
ce01c571
Exists in
master
and in
1 other branch
support for adding choices via the api
Showing
3 changed files
with
39 additions
and
75 deletions
Show diff stats
app/controllers/choices_controller.rb
| 1 | -class ChoicesController < ApplicationController | |
| 2 | - # GET /choices | |
| 3 | - # GET /choices.xml | |
| 4 | - def index | |
| 5 | - @choices = Choice.all | |
| 1 | +class ChoicesController < InheritedResources::Base | |
| 2 | + respond_to :xml, :json | |
| 3 | + actions :show, :index, :create, :update | |
| 4 | + belongs_to :question | |
| 5 | + has_scope :active, :boolean => true, :only => :index | |
| 6 | + | |
| 7 | + | |
| 8 | + def create_from_abroad | |
| 9 | + authenticate | |
| 10 | + logger.info "inside create_from_abroad" | |
| 11 | + | |
| 12 | + @question = Question.find params[:question_id] | |
| 13 | + # @visitor = Visitor.find_or_create_by_identifier(params['params']['sid']) | |
| 14 | + # @item = current_user.items.create({:data => params['params']['data'], :creator => @visitor} | |
| 15 | + # @choice = @question.choices.build(:item => @item, :creator => @visitor) | |
| 6 | 16 | |
| 7 | 17 | respond_to do |format| |
| 8 | - format.html # index.html.erb | |
| 9 | - format.xml { render :xml => @choices } | |
| 10 | - end | |
| 11 | - end | |
| 12 | - | |
| 13 | - # GET /choices/1 | |
| 14 | - # GET /choices/1.xml | |
| 15 | - def show | |
| 16 | - @choice = Choice.find(params[:id]) | |
| 17 | - | |
| 18 | - respond_to do |format| | |
| 19 | - format.html # show.html.erb | |
| 20 | - format.xml { render :xml => @choice } | |
| 21 | - end | |
| 22 | - end | |
| 23 | - | |
| 24 | - # GET /choices/new | |
| 25 | - # GET /choices/new.xml | |
| 26 | - def new | |
| 27 | - @choice = Choice.new | |
| 28 | - | |
| 29 | - respond_to do |format| | |
| 30 | - format.html # new.html.erb | |
| 31 | - format.xml { render :xml => @choice } | |
| 32 | - end | |
| 33 | - end | |
| 34 | - | |
| 35 | - # GET /choices/1/edit | |
| 36 | - def edit | |
| 37 | - @choice = Choice.find(params[:id]) | |
| 38 | - end | |
| 39 | - | |
| 40 | - # POST /choices | |
| 41 | - # POST /choices.xml | |
| 42 | - def create | |
| 43 | - @choice = Choice.new(params[:choice]) | |
| 44 | - | |
| 45 | - respond_to do |format| | |
| 46 | - if @choice.save | |
| 47 | - flash[:notice] = 'Choice was successfully created.' | |
| 48 | - format.html { redirect_to(@choice) } | |
| 49 | - format.xml { render :xml => @choice, :status => :created, :location => @choice } | |
| 18 | + if @choice = current_user.create_choice(params['params']['data'], @question, {:data => params['params']['data']}) | |
| 19 | + saved_choice_id = Proc.new { |options| options[:builder].tag!('saved_choice_id', @choice.id) } | |
| 20 | + logger.info "successfully saved the choice #{@choice.inspect}" | |
| 21 | + format.xml { render :xml => @question.picked_prompt.to_xml(:methods => [:left_choice_text, :right_choice_text], :procs => [saved_choice_id]), :status => :ok } | |
| 22 | + format.json { render :json => @question.picked_prompt.to_json, :status => :ok } | |
| 50 | 23 | else |
| 51 | - format.html { render :action => "new" } | |
| 52 | - format.xml { render :xml => @choice.errors, :status => :unprocessable_entity } | |
| 24 | + format.xml { render :xml => @choice.errors, :status => :unprocessable_entity } | |
| 25 | + format.json { render :json => @choice.errors, :status => :unprocessable_entity } | |
| 53 | 26 | end |
| 54 | 27 | end |
| 55 | 28 | end |
| 56 | - | |
| 57 | - # PUT /choices/1 | |
| 58 | - # PUT /choices/1.xml | |
| 59 | - def update | |
| 60 | - @choice = Choice.find(params[:id]) | |
| 61 | - | |
| 29 | + | |
| 30 | + | |
| 31 | + def skip | |
| 32 | + voter = User.by_sid(params['params']['auto']) | |
| 33 | + logger.info "#{voter.inspect} is skipping." | |
| 34 | + @question = Question.find(params[:question_id]) | |
| 35 | + @prompt = @question.prompts.find(params[:id]) | |
| 62 | 36 | respond_to do |format| |
| 63 | - if @choice.update_attributes(params[:choice]) | |
| 64 | - flash[:notice] = 'Choice was successfully updated.' | |
| 65 | - format.html { redirect_to(@choice) } | |
| 66 | - format.xml { head :ok } | |
| 37 | + if @skip = voter.skip(@prompt) | |
| 38 | + format.xml { render :xml => @question.picked_prompt.to_xml(:methods => [:left_choice_text, :right_choice_text]), :status => :ok } | |
| 39 | + format.json { render :json => @question.picked_prompt.to_json, :status => :ok } | |
| 67 | 40 | else |
| 68 | - format.html { render :action => "edit" } | |
| 69 | - format.xml { render :xml => @choice.errors, :status => :unprocessable_entity } | |
| 41 | + format.xml { render :xml => c, :status => :unprocessable_entity } | |
| 42 | + format.json { render :json => c, :status => :unprocessable_entity } | |
| 70 | 43 | end |
| 71 | 44 | end |
| 72 | 45 | end |
| 73 | - | |
| 74 | - # DELETE /choices/1 | |
| 75 | - # DELETE /choices/1.xml | |
| 76 | - def destroy | |
| 77 | - @choice = Choice.find(params[:id]) | |
| 78 | - @choice.destroy | |
| 79 | - | |
| 80 | - respond_to do |format| | |
| 81 | - format.html { redirect_to(choices_url) } | |
| 82 | - format.xml { head :ok } | |
| 83 | - end | |
| 84 | - end | |
| 85 | 46 | end | ... | ... |
app/models/user.rb
| ... | ... | @@ -3,6 +3,7 @@ class User < ActiveRecord::Base |
| 3 | 3 | has_many :visitors, :class_name => "Visitor", :foreign_key => "site_id" |
| 4 | 4 | has_many :questions, :class_name => "Question", :foreign_key => "site_id" |
| 5 | 5 | has_many :clicks, :class_name => "Click", :foreign_key => "site_id" |
| 6 | + has_many :items, :class_name => "Item", :foreign_key => "site_id" | |
| 6 | 7 | |
| 7 | 8 | def default_visitor |
| 8 | 9 | visitors.find(:first, :conditions => {:identifier => 'owner'}) |
| ... | ... | @@ -17,11 +18,12 @@ class User < ActiveRecord::Base |
| 17 | 18 | visitor = visitors.find_or_create_by_identifier(visitor_identifier) |
| 18 | 19 | raise "Question not found" if question.nil? |
| 19 | 20 | if visitor.owns?(question) |
| 20 | - choice = question.choices.create(choice_params.merge(:active => true)) | |
| 21 | + choice = question.choices.create!(choice_params.merge(:active => true, :creator => visitor)) | |
| 21 | 22 | else |
| 22 | - choice = question.choices.create(choice_params.merge(:active => false)) | |
| 23 | + choice = question.choices.create!(choice_params.merge(:active => false, :creator => visitor)) | |
| 23 | 24 | end |
| 24 | 25 | notify_question_owner_that_new_choice_has_been_added(choice) |
| 26 | + return choice | |
| 25 | 27 | end |
| 26 | 28 | |
| 27 | 29 | def record_vote(visitor_identifier, prompt, ordinality) | ... | ... |
app/models/visitor.rb
| ... | ... | @@ -3,6 +3,7 @@ class Visitor < ActiveRecord::Base |
| 3 | 3 | has_many :questions, :class_name => "Question", :foreign_key => "creator_id" |
| 4 | 4 | has_many :votes, :class_name => "Vote", :foreign_key => "voter_id" |
| 5 | 5 | has_many :skips, :class_name => "Skip", :foreign_key => "skipper_id" |
| 6 | + has_many :items, :class_name => "Item", :foreign_key => "creator_id" | |
| 6 | 7 | has_many :clicks |
| 7 | 8 | validates_presence_of :site, :on => :create, :message => "can't be blank" |
| 8 | 9 | validates_uniqueness_of :identifier, :on => :create, :message => "must be unique", :scope => :site_id | ... | ... |