2010-07-23 188 views
0

我为我的Rails 2.3 Web服务应用程序使用Inherited Resources。 这是一个伟大的图书馆,是Rails 3的一部分。Rails继承资源使用情况

我想弄清楚输出结果的最佳做法。

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

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

end 

它在请求成功时工作良好。但是,如果出现任何错误,我会收到“模板不见”错误。 @error基本上是消息和状态的散列,例如{:message => "Not authorized", :status => 401}。看起来respond_with只调用to_xmlto_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 

感谢。

回答

0

几件事情,然后才开始:

  • 第一关。这是Ruby。你知道有一个unless命令。你可以放下if !
  • 而且,你不必做的if !*.nil?双重否定 - 做if *.present?
  • 你不需要通过使nil发起的变量。除非您将其设置为before_chain,否则您将在以后的通话中覆盖它。

你想要做的是使用render :json方法。检查API,但它看起来是这样的:

render :json => { :success => true, :user => @user.to_json(:only => [:name]) } 
0

授权应当实现回调(的before_filter),和其余的代码应该被删除,并作为继承。只有输出应该参数化。这里有很多自定义代码...