Rails: создание веб-сервисов RESTful с XML и JSON - PullRequest
2 голосов
/ 21 июля 2010

Мне интересно узнать, как лучше всего создавать веб-сервисы, которые поддерживают вывод в формате XML и JSON.

В данный момент мой сервис ориентирован на XML (см. Ниже), но я хочу добавить поддержку JSON.

Вот один пример:

  def create
    render_authentication_error and return if !@user
    render_parameter_not_found_error("item") and return if params[:item].nil?
    render_parameter_not_found_error("name") and return if params[:item][:name].blank?
    @item = Item.new(params[:item])
    begin 
      if !@item.save 
        raise "Item not saved" 
      end 
    rescue 
      render_resource_not_saved_error("Error saving #{@item.name}")
    else 
      render_resource_created(:location => item_path(@item))
    end 
  end

В ApplicationController есть вспомогательные методы, которые соответственно отображают XML.

Я не уверен, как добавить сюда блок respond_to, так как мне нужно сделать проверки.Есть ли способ получить format в контроллере за пределами блока respond_to, чтобы я мог также выводить сообщения об ошибках в заданном формате?

respond_to do |format|
  format.html { render :json => @item.to_json }
  format.xml { render :xml => @item }
end 

Дайте мне знать, если вам нужны какие-либо разъяснения.

ОБНОВЛЕНИЕ Полагаю, я ищу что-то похожее на response_with в Rails 3. Я все еще на Rails 2.3 ... Интересно, можно ли это сделать2.3?

ОБНОВЛЕНИЕ Унаследованные ресурсы похоже на то, что я ищу.

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 июля 2010

Замените @person @item, но есть идея:

respond_to do |format|
  if @person.save 
    format.html { 
      flash[:notice] = 'Person was successfully created.'
      redirect_to @person 
    }
    format.js { render :json => @person, :status => :created, :location => @person} 
    format.xml  { render :xml => @person, :status => :created, :location => @person }
  else
    format.html { render :partial => "form" }
    format.js { render :json=>@person.errors, :status => :unprocessable_entity }
    format.xml  { render :xml => @person.errors, :status => :unprocessable_entity }
  end
end
1 голос
/ 21 июля 2010

Это немного сложно, но это может быть достигнуто.Смотрите здесь:

http://shifteleven.com/articles/2006/11/26/drying-up-respond_to

Также, может быть, вы можете посмотреть на request.format и передать его?Я почти уверен, что у него будет запрошенный формат ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...