我现在已经在这个问题上敲了大约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