Rails 4表单帮助程序在嵌套路由上失败

时间:2014-03-10 19:45:24

标签: ruby-on-rails ruby forms ruby-on-rails-4 nested-routes

我现在已经在这个问题上敲了大约2个小时。这对我来说毫无意义。我正在尝试编写一个3级嵌套的简单表单助手。 (我知道不建议使用3级嵌套,但只需在这里滚动一秒钟。)

我的routes.rb摘录如下:

resources :vendors, path: '', except: [:new, :create] do

  resources :item_links do
    resources :messages
  end

  resources :projects do
    resources :designs
  end

end

现在,当我渲染以下内容时,它会出错:

<%= form_for [@vendor, @item_link, Message.new], url: vendor_item_link_messages_path, method: :post, remote: true do |f| %>

No route matches {:action=>"index", :controller=>"messages", :vendor_id=>"thearborist", :project_id=>"4fad5bd7", :id=>"77ec58b5"} missing required keys: [:item_link_id]

我在这里指定了url,因为我的Vendor类和我的ItemLink类都有子类(sti),如果我没有指定url,我最终得到了我不想要的完全限定的路由

基于错误,它忽略了我完全指定的method参数,因为它试图访问“索引”动作而不是“创建”动作。其次,由于某种原因没有任何意义,它将project_id param插入等式中。无论是指定的参数还是我列出的url路径都没有参考项目。

此外,我决定具体并列出我的特定子类的路线:

resources :vendor_arborists do
  resources :item_link_standards do
    resources :messages
  end
end

这仍然会出现同样的错误

<%= form_for [@vendor, @item_link, Message.new], url: vendor_arborist_item_link_standard_messages_path, method: :post, remote: true do |f| %>

No route matches {:action=>"index", :controller=>"messages", :vendor_id=>"thearborist", :project_id=>"4fad5bd7", :id=>"77ec58b5"} missing required keys: [:vendor_arborist_id, :item_link_standard_id]

只有当我完全移除url param时才会最终开始工作:

<%= form_for [@vendor, @item_link, Message.new], method: :post, remote: true do |f| %>

为了增加这个谜团,好像这没有搞砸,我上面指定的第二组路线在指定或没有指定URL并且指定了或没有指定子类的情况下工作正常。

    <%= form_for [@vendor, @project, Design.new], url: vendor_project_designs_path, method: :post, remote: true do |f| %>

所以我现在对于出了什么问题感到困惑。我的模型都非常基本,这些是简单的Rails 101-esque路线。如果有人需要他们调试这个,我会发布任何其他细节,但我不知道在哪里看。我到底做错了什么???

更新

因此,在继续测试后,似乎这也有效。我想我可以继续前进,但这并不能解释为什么它在上面的设计示例中有效,但在使用Message的所有示例中都失败了。总的来说,似乎Rails 4中的某些东西导致这些路由助手搞砸了,因为这些例子在Rails 3.2中表现得很好,我正在从中迁移。

感谢:Rails 4 shallow routes resource form submission not working

<%= form_for Message.new, url: vendor_item_link_messages_path(@vendor, @item_link), method: :post, remote: true do |f| %>

补充阅读:
  Rails 4 [Best practices] Nested resources and shallow: true

控制器方法

这是渲染包含我的已破坏表单助手的视图的方法。我尝试将@project param归零,以防表单助手以某种方式自动访问它,但将其设置为null似乎没有任何影响。

def show
  @vendor = Vendor.find_by_subdomain( params[:vendor_id] )
  @project = @vendor.projects.find( params[:project_id] )
  @item_link = @project.item_links.find( params[:id] )

  @item_link.increment!(:views)

  respond_to do |format|
    format.html
  end
end

Rake Routes Output

    vendor_item_link_messages GET      /:vendor_id/item_links/:item_link_id/messages(.:format)                                                              item_links/messages#index
                              POST     /:vendor_id/item_links/:item_link_id/messages(.:format)                                                              item_links/messages#create
 new_vendor_item_link_message GET      /:vendor_id/item_links/:item_link_id/messages/new(.:format)                                                          item_links/messages#new
edit_vendor_item_link_message GET      /:vendor_id/item_links/:item_link_id/messages/:id/edit(.:format)                                                     item_links/messages#edit
     vendor_item_link_message GET      /:vendor_id/item_links/:item_link_id/messages/:id(.:format)                                                          item_links/messages#show
                              PATCH    /:vendor_id/item_links/:item_link_id/messages/:id(.:format)                                                          item_links/messages#update
                              PUT      /:vendor_id/item_links/:item_link_id/messages/:id(.:format)                                                          item_links/messages#update
                              DELETE   /:vendor_id/item_links/:item_link_id/messages/:id(.:format)                                                          item_links/messages#destroy

0 个答案:

没有答案