2013-04-24 145 views
6

尝试过论坛,文档和博客建议。它们聚合在语法上,对我来说,它并不能正确保存并通过想要的控制器进行路由。将Rails form_for路由到自定义控制器的语法

大图,我有两个共享功能的软件应用程序。为了实现共享功能,我让Rails生成Shared :: Widgets。这MVC工作得很好。查看,更新,创建或删除使用标准的共享/小部件&等路由没有问题。

然后,为了产品特定的功能,我创建了两个控制器:Product1 :: Widgets和Product2 :: Widgets。两者都从Shared :: Widgets控制器继承。除特定于产品的布局外,两者都是空的。

该方案几乎可行。当我路由到product1 /小部件时,它将layout设置为product1并调用shared/widgets的索引方法。结果是使用product1布局显示shared/widgets/index.html.erb。同样,当我路由到product2 /小部件时,它将设置product2布局并调用共享/小部件的索引方法。结果是使用product2布局显示shared/widgets/index.html.erb。完善。

但是现在我们到了form_for。因为它实现了轨道魔法,所以它确实想要直接路由到Shared :: Widgets控制器。但那不是我想要的。我希望它路由到适当的产品控制器以设置布局。轨道生成的form_for是这样的:

form_for(@shared_widget, :html => { :class => "form"}) do |f| 

我想:

form_for([:product1, @widget], :html => { :class => "form"}) do |f| 

但复制命名空间(product1_widget_shared_widget_path)。

我尝试以下三种格式,所有这些似乎正确的路线,并保存记录,但记录为空(列是空白):

form_for(@widget, url => "product1/widget", :html => { :class => "form"}) do |f| 

form_for(@widget, url => url_for(:controller => "widget"), :html => { :class => "form"}) do |f| 

form_for(@widget, url => url_for(:controller => "widget", :action => "create"), :html => { :class => "form"}) do |f| 

任何帮助吗?如果上面的代码有拼写错误,那是由于转录。我使用的实际代码通过了解释器。谢谢。

回答

2

试试这个

form_for(url: { controller: "posts", action: "create" }, html => { :class => "form" }, method: "post") do |f|