我的路线文件中有以下内容
resources :details, only: [:show, :edit, :update, :new]
和new.html.erb
<%= form_for(@detail) do |f| %>
<%= render 'fields', f: f %>
<% end -%>
并在细节控制器中
def new
@detail = Detail.new
end
呈现new.html.erb时,收到以下错误消息
undefined method `details_path' for #<#<Class:0x007fc4ac6bd730>:0x007fc4b62e7390>
造成这种情况的原因是什么?
答案 0 :(得分:4)
原因是form_for帮助器希望发布到/details
。所以它不是寻找索引路径而是寻找:创建路径。
因此您需要将:create action添加到路线声明
resources :details, only: [:show, :edit, :update, :new, :create]
如果在这种情况下查看渲染的html,它将看起来像这样
<form class="new_detail" id="new_detail" action="/details" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="✓" />
所以你可以看到为什么你需要:创建路径来创建帖子/细节路径。
答案 1 :(得分:1)
create和index操作使用相同的路径但不同的操作。因此,如果您在路径文件中有任何一个,那么将生成details_path
方法。在您的情况下,您需要确保在路线文件中包含创建:
resources :details, only: [:create, :show, :edit, :update, :new]
答案 2 :(得分:0)
要为您的答案提供背景信息,您需要查看Rails的resourceful
性质&#39;路线:
浏览器通过使用特定
HTTP
方法请求网址来请求来自Rails的网页,例如GET
,POST
,PATCH
,PUT
和DELETE
。每种方法都是对资源执行操作的请求。资源路由将许多相关请求映射到单个控制器中的操作。
当你说...&#34; form_for
帮助者希望发布到/details
&#34;时,它的实际上希望发布您的表单数据到create
方法。它的方式是通过POST
路线上的/details
动词:
因此,如果您希望使用资源丰富的路由结构,则需要确保自己声明create
路由。
这就是您需要以下内容的原因:
#config/routes.rb
resources :details, only: [:show, :edit, :update, :new, :create]
or
resources :details, except: :index
-
当然,你不必须使用它。
您可以使用您想要的任何路线。但重要的是要了解Rails是围绕convention构建的; HTTP's面向resources
:
服务器(提供资源,例如
HTML
个文件和其他内容,或代表client
执行其他功能)会返回response
条消息给客户
这就是为什么你有足够的资源&#34;路由等。
在Rails&#39;之上object orientated性质,您需要了解应用中某些位置正在使用哪些资源。
form_for
期望new
对象路由到create
路由。您可以使用url:
选项覆盖此内容:
<%= form_for @object, url: none_resourceful_path ...