我们的rails 3.2 app中定义了copy
操作和copy.html.erb
。此复制操作是从当前记录复制,允许用户稍微修改并提交创建,就像new
一样。以下是copy.html.erb
的标题:
<%= form_for @engine_config, :as => :engine_config, :url => engine_configs_path do |f| %>
点击save
后,它会点击控制器中的create
,这就是我们想要的。
我们的问题是engine_configs_path代表什么?通常engine_configs_path
用于索引。这里的表单用于创建而不是索引。创建表单上的索引路径的原因是什么?
答案 0 :(得分:5)
当你bundle exec rake routes
时,你会看到类似的内容;
engine_configs GET /engine_configs(.:format) engine_configs#index
POST /engine_configs(.:format) engine_configs#create
这意味着engine_configs_path
适用于GET
控制器操作的index
和POST
控制器操作的create
。
因此engine_configs_path
指的是表单在控制器中发布的网址。
答案 1 :(得分:1)
engine_configs_path
的行为取决于HTTP动词。也就是说,到engine_configs_path
的HTTP GET将显示索引;到engine_configs_path
的HTTP POST将创建一个新的。 form_for
可以通过@engine_config
检查数据库中是否存在@engine_config.new_record?
,因此它知道执行POST而不是PUT。
答案 2 :(得分:1)
<强>表格强>
您通常不需要在url
- Rails&#39;中定义form
参数。 form_for
帮助器获取一个初始化的类对象&amp;自动提取所需的数据:
来自docs:
通常,用于创建或更新资源的表单反映了 资源的身份有几种方式:
(i)表格的网址 发送到(表单元素的action属性)应该导致a 请求被路由到适当的控制器操作(使用 适当:在现有资源的情况下为id参数)
(ⅱ) 输入字段应以控制器中的方式命名 它们的值出现在params散列中的适当位置,
(iii)对于现有记录,最初是表格 显示,输入与资源属性对应的字段 应该显示这些属性的当前值。
在Rails中,通常通过使用form_for创建表单来实现 以及一些相关的辅助方法。 form_for生成一个 适当的表单标记,并生成一个知道的表单生成器对象 模型的形式是关于。输入字段是通过调用方法创建的 在表单构建器上定义,这意味着他们能够生成 适当的名称和与模型对应的默认值 属性,以及方便的ID等。中的约定 生成的字段名称允许控制器很好地接收表单数据 在没有任何努力的情况下以params结构。
-
<强>路线强>
您的具体问题与route
form_for
方法将使用
根据w3c standards,HTML表单默认为POST
个数据。这意味着无论何时在Rails中使用form_for
助手,它都会自动使用路由的POST
变体
正如Acacia
所述,如果您使用resourceful
路线,您将获得以下一系列路线:
这意味着您可以使用engine_configs_path
的HTTP动词调用相同的路线(POST
)发送给特定的controller#action
,这就是您正在发生的事情< / p>