我有一个名为Project的模型,它是公司存储的信息的集合。该公司可以通过两种方式创建项目。
第一种是标准的RESTful方式 - 公司转到Project索引,然后单击“New Project”,并在创建时通过flash消息返回索引。
第二个是“快速创建”,当公司查看客户的个人资料时可以访问。从这里开始,公司可以输入一些基本信息并发送给客户创建一个项目(客户端在这里自动指定)。
这两个场景中的第二个场景是从clients / show访问的项目。将这些数据发送到projects / create通常会将公司路由到项目/索引,但我不希望如此。在这种情况下,创建操作有意义的不同之处在于某些字段的处理方式不同,重定向也不同。你有什么建议我做的?
谢谢!
答案 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'或者其他什么。您可以将部分和参数的形式变干为部分以告诉如何渲染事物......这似乎是最简单的方法。
我有这种半理性(或者说是半无理性的)与利用推荐人挂钩......