为什么form_for helper需要新操作的索引路径

时间:2016-01-31 22:15:16

标签: ruby-on-rails

我的路线文件中有以下内容

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>

造成这种情况的原因是什么?

3 个答案:

答案 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="&#x2713;" />

所以你可以看到为什么你需要:创建路径来创建帖子/细节路径。

答案 1 :(得分:1)

create和index操作使用相同的路径但不同的操作。因此,如果您在路径文件中有任何一个,那么将生成details_path方法。在您的情况下,您需要确保在路线文件中包含创建:

resources :details, only: [:create, :show, :edit, :update, :new]

答案 2 :(得分:0)

要为您的答案提供背景信息,您需要查看Rails的resourceful性质&#39;路线:

  

浏览器通过使用特定HTTP方法请求网址来请求来自Rails的网页,例如GETPOSTPATCHPUTDELETE。每种方法都是对资源执行操作的请求。资源路由将许多相关请求映射到单个控制器中的操作。

当你说...&#34; form_for帮助者希望发布到/details&#34;时,它的实际上希望发布您的表单数据到create方法。它的方式是通过POST路线上的/details动词:

enter image description here

因此,如果您希望使用资源丰富的路由结构,则需要确保自己声明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 ...