Использование унаследованных ресурсов Rails - PullRequest
0 голосов
/ 23 июля 2010

Я использую Inherited Resources для моего приложения веб-сервиса Rails 2.3.Это отличная библиотека, которая входит в состав Rails 3.

Я пытаюсь найти наилучший способ вывода результата.

class Api::ItemsController < InheritedResources::Base
  respond_to :xml, :json
  def create
    @error = nil 
    @error = not_authorized if !@user
    @error = not_enough_data("item") if params[:item].nil? 

    @item = Item.new(params[:item])
    @item.user_id = @user.id
    if !@item.save
      @error = validation_error(@item.errors)
    end 
    if !@error.nil?
      respond_with(@error)
    else 
      respond_with(@swarm)
    end 
  end

end

Хорошо работает, когда запрос успешен.Однако, когда есть какая-либо ошибка, я получаю ошибку «Шаблон отсутствует».@error - это, по сути, хэш сообщения и статуса, например {:message => "Not authorized", :status => 401}.Кажется, respond_with вызывает только to_xml или to_json с конкретной моделью, с которой связан контроллер.

Какой элегантный способ справиться с этим?Я хочу избежать создания файла шаблона для каждого действия и каждого формата (в данном случае create.xml.erb и create.json.erb)

В основном я хочу:

/create.json [POST] => {"name": "my name", "id":1}  # when successful 
/create.json [POST] => {"message" => "Not authorized", "status" => 401} # when not authorized

Спасибозаблаговременно.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2010

авторизация должна быть реализована как обратный вызов (before_filter), а остальная часть кода должна быть удалена и использована как унаследованная.Только выходные данные должны быть параметризованы. Слишком много пользовательского кода здесь ...

0 голосов
/ 27 октября 2010

Несколько вещей, прежде чем мы начнем:

  • Сначала. Это Руби. Вы знаете, что есть команда unless. Вы можете прекратить делать if !
  • Кроме того, вам не нужно делать двойной отрицательный результат if !*.nil? - Do if *.present?
  • Вам не нужно инициировать переменную, сделав ее nil. Если вы не установите его в before_chain, который вы все равно просто перезапишете в будущих вызовах.

То, что вы хотите сделать, это использовать метод render :json. Проверьте API, но это выглядит примерно так:

render :json => { :success => true, :user => @user.to_json(:only => [:name]) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...