如何使用多个入口点RESTful路由?

时间:2011-07-18 20:34:19

标签: ruby-on-rails ruby-on-rails-3 rest routes

我有一个名为Project的模型,它是公司存储的信息的集合。该公司可以通过两种方式创建项目。

第一种是标准的RESTful方式 - 公司转到Project索引,然后单击“New Project”,并在创建时通过flash消息返回索引。

第二个是“快速创建”,当公司查看客户的个人资料时可以访问。从这里开始,公司可以输入一些基本信息并发送给客户创建一个项目(客户端在这里自动指定)。

这两个场景中的第二个场景是从clients / show访问的项目。将这些数据发送到projects / create通常会将公司路由到项目/索引,但我不希望如此。在这种情况下,创建操作有意义的不同之处在于某些字段的处理方式不同,重定向也不同。你有什么建议我做的?

  1. 在项目中构建替代“create_from_client”操作。
  2. 在客户端中构建“create_project”操作。
  3. 向projects / create发送参数并设置client_id,如果该参数存在,则重定向到client / show。
  4. 我不知道的其他事情。
  5. 谢谢!

3 个答案:

答案 0 :(得分:1)

您可以直接从Request对象和分叉利用引荐来源,类似于redirect_to :back的工作方式。

来自redirect_to选项哈希的Rails API文档:

  

:返回 - 返回发出请求的页面。   适用于从多个位置触发的表单。   redirect_to(request.env [“HTTP_REFERER”])

的简写

所以你可以简单地做这样的事情:

def create
  @project = Project.new( params[:project] )
  @project.save
  respond_with @project, location: get_location!
end

private

def get_location!
  case request.env["HTTP_REFERER"]
  # Your routing logic here.
end

这也很好,也很容易进行单元测试,如果你是这样的话。 :)

context "if the user came from the regular form" do
  before { controller.request.env["HTTP_REFERER"] = "regular_form_url" }

  it "redirects to the index path" do
    post :create
    response.should redirect_to :index
  end
end

context "if the user came from the quick-create form" do
  before { controller.request.env["HTTP_REFERER"] = "quick_create_url" }

  it "redirects to some other path" do
    post :create
    response.should redirect_to some_other_path
  end
end

答案 1 :(得分:0)

我通常会使用当前网址添加隐藏的referer字段,然后重定向到它

例如

def create
  @project = Project.new params[:project]
  @project.save
  respond_with @project, :location => params[:referer] || [:index, :projects]
end

答案 2 :(得分:0)

我只是向控制器添加另一个动作,'quick_create'或者其他什么。您可以将部分和参数的形式变干为部分以告诉如何渲染事物......这似乎是最简单的方法。

我有这种半理性(或者说是半无理性的)与利用推荐人挂钩......