Тип данных не передается правильно для веб-сервиса Rails 3.1 - PullRequest
1 голос
/ 14 декабря 2011

У меня есть приложение веб-службы Rails RESTful, которое принимает значение от клиента для увеличения значения в базе данных. Значением базы данных является целое число, но при использовании rspec для проверки кода передаваемое значение интерпретируется как строка.

Я использую Rails 3.1 и Ruby 1.9.2.

Вот фрагмент rspec:

...
it "should find Points and return object" do
  put :update, :username => "tester", :newpoints => [10, 15, 0], :format => :xml
end
...

Вот код контроллера:

...
respond_to do |format|
  if points.update_attributes([xp + :newpoints[0]][sp + :newpoints[1]][cash +        :newpoints[2]])
    format.json { head :ok }
    format.xml { head :ok }
...

xp, sp и cash являются значениями из базы данных и были проверены как тип данных Fixnum. Я получаю ошибку:

TypeError: String can't be coerced into Fixnum

Как мне написать свой тест, чтобы гарантировать, что передаваемые параметры передаются как правильный тип данных?

Я могу включить больше кода при необходимости. Заранее спасибо!

1 Ответ

0 голосов
/ 14 декабря 2011

Это заняло у меня немного головокружения, но я обнаружил, что все неправильно передал. Решение, которое я придумала, определенно не является лучшим решением и, вероятно, может быть переписано, но оно работает, и на данный момент этого достаточно.

Изменением во фрагменте rspec стало создание хеша, представленного символом: newpoints

it "should find Points and return object" do
  put :update, :username => "tester", :newpoints => {"experience_points" => 10, "shame_points" => 15, "gold" => 0}, :format => :xml
end

Обработка этого запроса в контроллере потребовала небольшой доработки, но вот соответствующие части:

class PointsController < ApplicationController
  #before_filter :authenticate, :only => :update
  before_filter :must_specify_user
  before_filter :fix_params
  before_filter :clean_up
  respond_to :html, :xml, :json

  def fix_params
    if params[:points]
      params[:points][:user_id] = @user.id if @user
    end
  end

 def clean_up
   @newpoints = params[:newpoints]
   @experience = @newpoints["experience_points"]
   @shame = @newpoints["shame_points"]
   @gold = @newpoints["gold"]
   @xp = @experience.to_i
   @sp = @shame.to_i
   @cash = @gold.to_i
end

def update
  points = Points.find_by_user_id(@user.id, params[:id])
  xp = points.experience_points
  sp = points.shame_points
  cash = points.gold
  final_experience = xp += @xp
  final_shame = sp += @sp
  final_gold = cash += @cash
  final_points = {:experience_points => final_experience, :shame_points => final_shame, :gold => final_gold}
  if_found points do
    respond_to do |format|
      if points.update_attributes!(params[final_points])
        format.json { head :ok }
        format.xml { head :ok }
      else
        format.json { render :nothing => true, :status => "401 Not Authorized"}
        format.xml { render :nothing => true, :status => "401 Not Authorized"}
      end
    end
  end
end
end

Очевидно, что многое можно сделать, чтобы это следовало за СУХОЙ, а что нет, поэтому любые предложения по-прежнему приветствуются. Заранее спасибо!

...