1

我目前正在开发基于 Rails 3 构建的 Web 应用程序,该应用程序大量使用 Ajax/REST 作为客户端。因此,我经常发现自己编写这样的控制器操作:

def create
  if !params[:name] 
    respond_to do |format|
      format.html { render json: {}, status: :not_found }
      format.json { render json: {}, status: :not_found }
    end
    return
  end

  account = ...
  respond_to do |format|
    format.html { render json: account }
    format.json { render json: account }
  end
end

几乎我所有的操作都是在成功案例或错误代码中返回一个 json 对象。但是,如果我希望动作更早地返回,我总是必须编写这个详细的 respond_to 块并返回。

相反,我想改用这样的东西,或者类似的替代方案:

def create
  if !params[:name] 
    throw :not_found
  end

  account = ...
  return account
end

Rails 3+ 如何做到这一点?

4

2 回答 2

2

看看inherited_resources。这将允许您将控制器重写为:

class SomeController < ApplicationController
  inherit_resources
  respond_to :html, :js, :json
end

这就对了。您的所有创建/读取/更新/删除方法都将照常访问。您可以像我过去一样,从使用hereded_resources 的主资源控制器继承,然后您可以以更通用的方式调整响应。

class ResourcesController < ApplicationController
  inherit_resources
  respond_to :html, :js

  def create
    create! do |format|
      format.js do
        # generic code here for managing all create methods initiated via js
        # current model is avialbe via 'resource'
        # e.g 'resource.errors'
      end
    end
  end

然后简单地从该控制器继承:

class SomeController < ResourcesController

end

这种抽象对于大多数目的来说可能是多余的,但是当处理 30 或 40 个模型时,它非常方便,这些模型都需要类似的控制器。

Inherited_resources 为访问当前模型(称为资源)提供了许多帮助程序以促进动态引用,因此您可以例如返回相关表单或基于资源/模型名称的部分。

为了让您了解如何使用它,您可以通过在参数中使用控制器名称来返回当前控制器的表单。需要注意的是,格式错误的控制器名称不会到达此方法(因为它会返回 404),因此可以安全使用:

  format.js do
    render "#{params[:controller]}/form"
  end

最重要的是,您可以通过在特定控制器中定义它们来自己覆盖任何方法。

于 2012-11-15T11:18:37.293 回答
1

如果您总是返回 json,您可以省略该respond_to块并将其编写为:

def create
  if !params[:name] 
    render json: {}, status: :not_found
    return
  end

  account = ...
  render json: account
end
于 2012-11-15T10:59:47.047 回答